I'm trying to modify this tutorial to include a prebuilt C library in my Android Studio project (ie. not using the experimental Gradle plugin) http://kvurd.com/blog/compiling-a-cpp-library-for-android-with-android-studio/
The library itself is coming from a client who won't reveal the source code, therefore I have no control over that part of the build process, however they are already following the same tutorial.
The project builds, load-library works and the NDK link (/jni/my-wrapper.c) works fine, until I try to call the actual library function defined in my prebuild header. The error I'm receiving is:
$ ndk-build [arm64-v8a] Compile : my-wrapper <= my-wrapper.c [arm64-v8a] SharedLibrary : libmy-wrapper.so /Users/me/AndroidStudioProjects/MyProject/app/obj/local/arm64-v8a/objs/my-wrapper/my-wrapper.o: In function `Java_com_my_project_SignInActivity_CallFunction': /Users/me/AndroidStudioProjects/MyProject/app/jni/my-wrapper.c:44: undefined reference to `MyFunction' collect2: error: ld returned 1 exit status make: *** [/Users/me/AndroidStudioProjects/MyProject/app/obj/local/arm64-v8a/libmy-wrapper.so] Error 1 Here's my Android.mk:
LOCAL_PATH := $(call my-dir) # static library info include $(CLEAR_VARS) LOCAL_MODULE := libMyLib LOCAL_MODULE_FILENAME := libMyLib LOCAL_SRC_FILES := ../prebuild/libMyLib.a LOCAL_EXPORT_C_INCLUDES := ../prebuild/include include $(PREBUILT_STATIC_LIBRARY) # wrapper info include $(CLEAR_VARS) LOCAL_C_INCLUDES += ../prebuild/include LOCAL_MODULE := my-wrapper LOCAL_SRC_FILES := my-wrapper.c LOCAL_STATIC_LIBRARIES := libMyLib include $(BUILD_SHARED_LIBRARY) And MyLib.h (note that foobar() works fine as it's in the header but as long as I'm calling MyFunction from within my-wrapper.c the ndk-build fails):
#include <math.h> #include <setjmp.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int MyFunction(some stuff); int foobar(){return 1;}; Finally, my-wrapper.c:
#include <MyLib.h> jbyte Java_com_my_project_SignInActivity_MyFunction(JNIEnv *env, jobject thiz, some other stuff){ // return MyFunction(some other stuff which I cast to C types); //linker fails if uncommented return foobar(); //works fine }
nmtool included in the Android NDK.nm libMyLib.aresults in0000458c T _Z12MyFunctionP9my_structPhS1_S1_- so it looks like it's there unless there's some subtlety I'm missing