未定义的引用'__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_LIBRARIES
或LOCAL_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 ++代码添加到您的项目中