opencv交叉编译:undefined reference to `__android_log_print'
解决Error: undefined reference to `__android_log_print'
最近在使用Android Studio进行NDK开发时,程序本身是没有问题,但一旦添加了Android的NDK调试信息,就报如下的错:
在旧的Android Studio版本中,一般是在build.gradle中修改,但新版本了换为了CMakeLists.txt:需要这样修改:即新增“log-lib”
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that # you want CMake to locate. log ) target_link_libraries( # Specifies the target library. imagePro-lib
# Specifies the name of the NDK library that # you want CMake to locate. log ) target_link_libraries( # Specifies the target library. imagePro-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
undefined reference to `__android_log_print'
What is wrong with my make file?
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-build
foo.c:9: undefined reference to `__android_log_print'
-
Modify line LOCAL_EXPORT_LDLIBS := -llog to LOCAL_LDLIBS := -llog– Shiv BuyyaMar 11, 2021 at 6:57
15 Answers
You need to add
LOCAL_LDLIBS := -llog
to Android.mk
-
1correct. if there are multiple libraries, need to add this statement for each one of them (after CLEAR VARS) Jan 19, 2016 at 4:17
Try the following in your Android.mk
file:
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
-
1What is the necessary to add this? Would you Please explain in detail?– DhasneemMar 7, 2013 at 12:40
-
its adding an android library to the make file - and it worked for me too– gheeseApr 24, 2013 at 15:08
-
9
-
5If using the new Gradle NDK integration in Android Studio 1.3, you need to add
ldLibs = ["android", "log"]
to your android.ndk options Sep 24, 2015 at 4:20 -
1
If you use Android Studio and gradle, it ignores Android.mk. Add this to your build.gradle file:
android {
defaultConfig {
ndk {
moduleName "your_module_name"
ldLibs "log"
}
}
}
-
7I wonder where this is documented. I was looking for this as well. Dec 19, 2014 at 6:19
-
1I was getting "undefined reference to '__android_log_print'" before I have added
ldLibs
. Thanks. Jan 2, 2015 at 10:54 -
2Adding this fixed it for me. Just make sure to add the
ndk
part in the build.gradle inside theapp
folder instead of the one in the project folder (module name).– mathiassJun 6, 2015 at 20:59 -
-
15this did NOT work for me. this is what I had to do:
ldLibs.addAll(["android", "log"])
– ᴛʜᴇᴘᴀᴛᴇʟFeb 4, 2016 at 7:09
For Android Studio 2.2 and tools.build:gradle:2.2.0 using CMake add or edit row in CMakeLists.txt:
target_link_libraries(<your_library_name>
android
log)
Thats connecting log library to yours.
If you upgrade to Android Studio 2.1, above answers do not work, need use ldLibs.add() to load the lib as below:
android.ndk {
moduleName = "[the_module_name]"
ldLibs.addAll(['android', 'log'])
}
In case the project you are working on has the following characteristics that differ from other 'standard' answers:
- Not using Android Studio
- Not using gradle and the integrated CMake
- No Android.mk or Application.mk used at all for build
- Using CMake and the toolchain directly (maybe your project is Qt based and without using QtCreator neither)
The following target_link_libraries usage makes it:
find_library(ANDROID_LOG_LIB log)
target_link_libraries(${TARGET_NAME} ${ANDROID_LOG_LIB})
Being TARGET_NAME
the name of the target to build (having set it up before with add_library
or add_executable
).
find_library
is equally important as well as setting up the toolchain properly (use the toolchain provided by Android SDK at ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake
so it sets up CMAKE_SYSROOT
which is used by find_
commands).
-
Only solution that helped me! Thanks a ton, I would extend it by a test if the library was found for better feedback to the developer as here stackoverflow.com/a/37868829/10030695– ManuelTSJan 6, 2019 at 15:02
We can link a shared library in Android in 3 ways. In below 3 cases, the lines mentioned should be added in Android.mk
So here are the three ways.
1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog
For some reason if 1 doesnt work(it did not work for me), You can try below 2 ways
2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog
3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog
Of course you also need to include #include <android/log.h>
in your C/H file.
Yes, you do need to add: LOCAL_LDLIBS := -llog
as the other answers/comments have specified, however the original question did not specify if he use the jni library as: LOCAL_JNI_SHARED_LIBRARIES
or as LOCAL_REQUIRED_MODULES
.
I can pretty much say for sure that he has it used it as: LOCAL_REQUIRED_MODULES
because of the LOCAL_EXPORT_LDLIBS := -llog
in the question... unless that was added after an edit.
If you use LOCAL_REQUIRED_MODULES
the shared library is installed in /system/lib instead of into the apk, because it is a required module. Therefore you will need to add LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
instead of just LOCAL_LDLIBS := -llog
so that when the build system is building & linking the jni shared library, it will have the -llog
definitions in the correct place, available to be built under $OUT/root/system/lib
. Otherwise you will continue to get the same answer, even if you only add LOCAL_LDLIBS := -llog
.
So, those who commented that the -L
is not needed, and the other answer was correct, they were actually incorrect in this situation.
In lieu with
If using the new Gradle NDK integration in Android Studio 1.3, you need to add ldLibs = ["android", "log"] to your android.ndk options – Stephen Kaiser Sep 24 at 4:20
use ldLibs.addAll(["android", "log"])
for the experimental plugin
Add
LOCAL_SHARED_LIBRARIES:= \
libbinder \
liblog \
to Android.mk
-
3
This helped for me:
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)
In the android studio version 2.2 and higher, there is inbuilt support for CPP when you create a new project. Also, the liblog.so is included by default. Nothing to be done apart from including the header file (android/log.h).
Checkout app/CMakeLists.txt that is created by the studio when we create new android studio project. We can see that the find_library() block and target_link_libraries() block for loglib are already present.
Also, pay attention towards the function syntax. It should be:
__android_log_print (int priority, const char *tag, const char *fmt,...);
In my case, I had left out tag parameter and ended up spending good 3 days in figuring it out.
More about CMake: Add C and C++ Code to Your Project
add LOCAL_SHARED_LIBRARIES:= liblog
to Android.mk can solve my isuue. This is because the __android_log_print
is defined in libLog
TO build with Android.bp, follow the below solution:
In this -android_log_print is defined in NDK, so for this, there is already a library is available. Use "liblog" library using shared_libs tag, take reference of the below code:
target: {
android: {
cppflags: [
"-g",
"-DUSE_LIBLOG",
],
shared_libs: ["liblog"], // can use other dependency if required.
},
darwin: {
enabled: false,
},
},
每一个不曾起舞的日子,都是对生命的辜负。
But it is the same with man as with the tree. The more he seeks to rise into the height and light, the more vigorously do his roots struggle earthward, downward, into the dark, the deep - into evil.
其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采