未定义的引用'__android_log_print'

我的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"); } 

NDKbuild造

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

在您的Android.mk文件中尝试以下内容:

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

你需要添加

 LOCAL_LDLIBS := -llog 

到Android.mk

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

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

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

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

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

 target_link_libraries(<your_library_name> android log) 

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

我们可以通过三种方式链接Android中的共享库。 在以下三种情况下,应该在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 <android/log.h>

代替

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

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

 LOCAL_SHARED_LIBRARIES:= \ libbinder \ liblog \ 

到Android.mk

是的,您需要添加: LOCAL_LDLIBS := -llog因为其他答案/注释已经指定,但原始问题没有指定他是否使用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这样当构build系统正在构build和链接jni共享库时,它将具有-llog定义在正确的位置,可以在$OUT/root/system/lib 。 否则,即使只添加LOCAL_LDLIBS := -llog ,您仍将继续获得相同的答案。

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

这对我有帮助:

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) 

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

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

另外,注意function语法。 它应该是:

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

在我的情况下,我已经放弃了标签参数,最终花了好几天的时间来搞清楚。

关于CMake的更多信息: 将C和C ++代码添加到您的项目中