【问题标题】:undefined reference to `__android_log_print'对“__android_log_print”的未定义引用
【发布时间】:2011-05-26 06:01:47
【问题描述】:

我的 make 文件有什么问题?

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := foo
LOCAL_SRC_FILES := foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

foo.c

#include <string.h>
#include <jni.h>
#include <android/log.h>

#define  LOG_TAG    "foo"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

void test() {
    LOGI("test");
}

ndk 构建

foo.c:9: undefined reference to `__android_log_print'

【问题讨论】:

  • 修改行 LOCAL_EXPORT_LDLIBS := -llog 为 LOCAL_LDLIBS := -llog

标签: android java-native-interface logging android-ndk


【解决方案1】:

你需要添加

LOCAL_LDLIBS := -llog

到 Android.mk

【讨论】:

  • 正确。如果有多个库,需要为每个库添加此语句(在 CLEAR VARS 之后)
【解决方案2】:

在您的 Android.mk 文件中尝试以下操作:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

【讨论】:

  • 添加这个需要什么?能详细解释一下吗?
  • 它在 make 文件中添加了一个 android 库 - 它也对我有用
  • -L 是不必要的。请改为接受其他答案。
  • 如果在 Android Studio 1.3 中使用新的 Gradle NDK 集成,您需要将 ldLibs = ["android", "log"] 添加到您的 android.ndk 选项中
  • 如果我们不使用 Android.mk 怎么办?
【解决方案3】:

如果您使用 Android Studio 和 gradle,它会忽略 Android.mk。将此添加到您的 build.gradle 文件中:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}

【讨论】:

  • 我想知道这是在哪里记录的。我也在找这个。
  • 在添加 ldLibs 之前,我得到了“对 '__android_log_print' 的未定义引用”。谢谢。
  • 添加这个为我修复了它。只需确保在 app 文件夹内的 build.gradle 中添加 ndk 部分,而不是项目文件夹中的部分(模块名称)。
  • 从 Gradle 2.5 开始使用 'ldLibs += "log"' 轻微的语法变化
  • 这对我不起作用。这就是我必须做的:ldLibs.addAll(["android", "log"])
【解决方案4】:

对于使用 CMake 的 Android Studio 2.2 和 tools.build:gradle:2.2.0 在 CMakeLists.txt 中添加或编辑行:

target_link_libraries(<your_library_name> 
                      android 
                      log)

那就是将日志库连接到你的。

【讨论】:

    【解决方案5】:

    如果升级到 Android Studio 2.1,以上答案不起作用,需要使用 ldLibs.add() 来加载 lib,如下所示:

    android.ndk {
        moduleName = "[the_module_name]"
        ldLibs.addAll(['android', 'log'])
    }
    

    【讨论】:

    • 最佳现代(2017 年末)答案
    【解决方案6】:

    如果您正在从事的项目具有以下不同于其他“标准”答案的特征:

    • 不使用 Android Studio
    • 不使用 gradle 和集成的 CMake
    • 构建时根本没有使用 Android.mk 或 Application.mk
    • 直接使用 CMake 和工具链(也许您的项目是基于 Qt 的,并且没有使用 QtCreator)

    以下target_link_libraries 用法使它成为:

        find_library(ANDROID_LOG_LIB log)
        target_link_libraries(${TARGET_NAME} ${ANDROID_LOG_LIB})
    

    作为TARGET_NAME要构建的目标的名称(之前已使用add_libraryadd_executable 设置它)。

    find_library 与正确设置工具链同样重要(使用 Android SDK 在ANDROID_SDK_HOME/cmake/&lt;version&gt;/android.toolchain.cmake 提供的工具链,因此它设置了CMAKE_SYSROOTfind_ 命令使用的工具链)。

    【讨论】:

    • 唯一对我有帮助的解决方案!非常感谢,如果找到该库以向开发人员提供更好的反馈,我将通过测试对其进行扩展,如stackoverflow.com/a/37868829/10030695
    【解决方案7】:

    我们可以通过 3 种方式链接 Android 中的共享库。 在以下3种情况下,应在Android.mk中添加提到的行

    所以这里是三种方式。

    1. LOCAL_LDLIBS way
    LOCAL_LDLIBS := -llog
    

    由于某种原因,如果 1 不起作用(它对我不起作用),您可以尝试以下 2 种方法

    2. LOCAL_LDFLAGS way
    LOCAL_LDFLAGS := -llog
    
    3. LOCAL_SHARED_LIBRARIES way
    LOCAL_SHARED_LIBRARIES += liblog
    

    当然,您还需要在 C/H 文件中包含 #include &lt;android/log.h&gt;

    【讨论】:

      【解决方案8】:

      是的,您确实需要添加:LOCAL_LDLIBS := -llog,因为其他答案/cmets 已指定,但是原始问题未指定他是否将 jni 库用作:LOCAL_JNI_SHARED_LIBRARIESLOCAL_REQUIRED_MODULES

      我几乎可以肯定地说,他将其用作:LOCAL_REQUIRED_MODULES,因为问题中的LOCAL_EXPORT_LDLIBS := -llog...除非是在编辑后添加的。

      如果您使用LOCAL_REQUIRED_MODULES,共享库将安装在 /system/lib 中,而不是安装在 apk 中,因为它是必需的模块。因此,您需要添加LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 而不仅仅是LOCAL_LDLIBS := -llog,以便在构建系统构建和链接jni 共享库时,它会在正确的位置有-llog 定义,可在@987654330 下构建@。否则,即使您只添加LOCAL_LDLIBS := -llog,您也会继续得到相同的答案。

      所以,那些评论说-L 是不需要的,而另一个答案是正确的,他们在这种情况下实际上是不正确的。

      【讨论】:

      • 感谢您实际解释发生了什么!
      【解决方案9】:

      代替

      如果在 Android Studio 1.3 中使用新的 Gradle NDK 集成,您需要将 ldLibs = ["android", "log"] 添加到您的 android.ndk 选项中 – Stephen Kaiser 9 月 24 日 4:20

      实验性插件使用ldLibs.addAll(["android", "log"])

      【讨论】:

        【解决方案10】:

        添加

        LOCAL_SHARED_LIBRARIES:= \
                libbinder                       \
                liblog                          \
        

        到 Android.mk

        【讨论】:

        • 为什么?请解释为什么这个答案应该适用于提问者。
        【解决方案11】:

        这对我有帮助:

        Android.mk

            LOCAL_PATH := $(call my-dir)
        include $(CLEAR_VARS)
        
        LOCAL_MODULE    := nativeDemo
        LOCAL_SRC_FILES := main.cpp
        LOCAL_LDLIBS += -llog
        
        include $(BUILD_SHARED_LIBRARY)
        

        【讨论】:

          【解决方案12】:

          在 android studio 2.2 及更高版本中,当您创建新项目时,内置了对 CPP 的支持。此外,liblog.so 默认包含在内。除了包含头文件(android/log.h)之外,什么都做不了。

          在我们创建新的 android studio 项目时,由工作室创建的 Checkout app/CMakeLists.txt。我们可以看到 loglib 的 find_library() 块和 target_link_libraries() 块已经存在。

          另外,请注意函数语法。应该是:

          __android_log_print (int priority, const char *tag, const char *fmt,...);

          在我的例子中,我遗漏了 tag 参数,最终花了 3 天的时间才弄清楚。

          更多关于 CMake:Add C and C++ Code to Your Project

          【讨论】:

            【解决方案13】:

            -DCMAKE_CXX_FLAGS="-llog" 帮助我

            【讨论】:

              【解决方案14】:

              添加 LOCAL_SHARED_LIBRARIES:= liblog 到 Android.mk 可以解决我的问题。 这是因为 __android_log_print 是在 libLog 中定义的

              【讨论】:

                【解决方案15】:

                要使用 Android.bp 构建,请遵循以下解决方案:

                在这个 -android_log_print 是在 NDK 中定义的,所以对于这个,已经有一个可用的库。使用 shared_libs 标签使用“liblog”库,参考以下代码:

                target: {
                        android: {
                            cppflags: [
                                "-g",
                                "-DUSE_LIBLOG",
                            ],
                            shared_libs: ["liblog"], // can use other dependency if required.
                        },
                        darwin: {
                            enabled: false,
                        },
                    },  
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-03-27
                  • 2022-01-22
                  • 2016-04-04
                  • 2015-11-03
                  • 2011-08-11
                  • 2019-07-22
                  相关资源
                  最近更新 更多