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'
In case the project you are working on has the following characteristics that differ from other 'standard' answers:
The following target_link_libraries usage makes it:
Being
TARGET_NAME
the name of the target to build (having set it up before withadd_library
oradd_executable
).find_library
is equally important as well as setting up the toolchain properly (use the toolchain provided by Android SDK atANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake
so it sets upCMAKE_SYSROOT
which is used byfind_
commands).If you upgrade to Android Studio 2.1, above answers do not work, need use ldLibs.add() to load the lib as below:
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:
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
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.
For some reason if 1 doesnt work(it did not work for me), You can try below 2 ways
Of course you also need to include
#include <android/log.h>
in your C/H file.For Android Studio 2.2 and tools.build:gradle:2.2.0 using CMake add or edit row in CMakeLists.txt:
Thats connecting log library to yours.
In lieu with
use
ldLibs.addAll(["android", "log"])
for the experimental plugin