我的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'
答案 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)
如果您正在处理的项目具有以下与其他标准不同的特征。答案:
以下target_link_libraries用法使其成为:
find_library(ANDROID_LOG_LIB log)
target_link_libraries(${TARGET_NAME} ${ANDROID_LOG_LIB})
成为TARGET_NAME
要构建的目标的名称(使用add_library
或add_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,
},
},