对__android_log_print'的未定义引用

时间:2010-12-15 23:15:46

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

我的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'

15 个答案:

答案 0 :(得分:95)

您需要添加

LOCAL_LDLIBS := -llog

到Android.mk

答案 1 :(得分:85)

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

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

答案 2 :(得分:83)

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

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

答案 3 :(得分:29)

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

target_link_libraries(<your_library_name> 
                      android 
                      log)

将日志库连接到您的。

答案 4 :(得分:16)

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

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

答案 5 :(得分:6)

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

所以这里有三种方式。

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

出于某种原因,如果1不起作用(它对我不起作用),你可以尝试以下两种方式

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

当然,您还需要在C / H文件中包含#include <android/log.h>

答案 6 :(得分:4)

代替

  

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

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

答案 7 :(得分:3)

添加

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

到Android.mk

答案 8 :(得分:3)

是的,您需要添加:LOCAL_LDLIBS := -llog,因为其他答案/评论已指定,但原始问题未指定他是否使用jni库:LOCAL_JNI_SHARED_LIBRARIES或{{1 }}。

我可以肯定地说,由于问题中的LOCAL_REQUIRED_MODULES,他将其用作LOCAL_REQUIRED_MODULES:除非在编辑后添加。

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

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

答案 9 :(得分:3)

如果您正在处理的项目具有以下与其他标准不同的特征。答案:

  • 不使用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/<version>/android.toolchain.cmake提供的工具链,因此设置CMAKE_SYSROOT find_ }命令)。

答案 10 :(得分:1)

这对我有帮助:

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)

答案 11 :(得分:0)

在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,...);

在我的情况下,我遗漏了标签参数,结果花了3天时间搞清楚。

有关CMake的更多信息:Add C and C++ Code to Your Project

答案 12 :(得分:0)

-DCMAKE_CXX_FLAGS =“-llog”帮助我

答案 13 :(得分:0)

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

答案 14 :(得分:0)

要使用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,
        },
    },