I work with JNI compiling main cross-platform library with CMake that compile all libraries in a library path.
Using variable CMAKE_BUILD_TYPE=Debug work fine, but using Release, when launch my Android app, throw:
I Launch my Android project using a fool Android.mk just to install in libs/armeabi-v7a and link the libraries correctly:
05-27 08:35:35.194: E/dalvikvm(10366): dlopen("/data/app-lib/com.stackoverflow.project-2/libandroid-fooa.so") failed: dlopen failed: "/data/app-lib/com.stackoverflow.project-2/libandroid-fooa.so" has unexpected e_type: 1
05-27 08:35:35.204: E/AndroidRuntime(10366): Process: com.stackoverflow.project-2, PID: 10366 05-27 08:35:35.204: E/AndroidRuntime(10366): java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app-lib/com.stackoverflow.project-2/libandroid-fooa.so" has unexpected e_type: 1 05-27 08:35:35.204: E/AndroidRuntime(10366): at java.lang.Runtime.loadLibrary(Runtime.java:364)
Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := android-opencvcamera_4_4-prebuilt
LOCAL_SRC_FILES := ../../../resources/lib/opencv/android/OpenCV-2.4.8-android-sdk/sdk/native/libs/armeabi-v7a/libnative_camera_r4.4.0.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := android-opencvcamera_4_2-prebuilt
LOCAL_SRC_FILES := ../../../resources/lib/opencv/android/OpenCV-2.4.8-android-sdk/sdk/native/libs/armeabi-v7a/libnative_camera_r4.2.0.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := android-foo-prebuilt
#LOCAL_SRC_FILES := ../../../../build/Android/trunk/lib/libfoo_d.so // work in debug
LOCAL_SRC_FILES := ../../../../build/Android/trunk/lib/libfoo.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := android-fooa-prebuilt
#LOCAL_SRC_FILES := ../../../../build/Android/trunk/lib/libandroid-fooa_d.so // work in debug
LOCAL_SRC_FILES := ../../../../build/Android/trunk/lib/libandroid-fooa.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := android-void
LOCAL_SRC_FILES := android-void.cpp // Has no code, generated by eclipse native option
include $(BUILD_SHARED_LIBRARY)
In Debug using android-ndk-r9d with eclipse launch command:
$(ANDROID_NDK)/ndk-build NDK_DEBUG=1
works fine. Stop at breakpoints, but not provide debug info when I stop in them, I don't know if this is important!
In release with:
$(ANDROID_NDK)/ndk-build NDK_DEBUG=0
And I load the library in my Java file:
// Load Native Libraries
// =========================================================================
static
{
//System.loadLibrary("foo_d");
//System.loadLibrary("android-fooa_d");
System.loadLibrary("foo");
System.loadLibrary("android-fooa");
}
Appear the linking problem.
I´ve found the problem, but I have no idea why is it happening. When I launch the application, ndk-build install in libs/armeabi-v7a the libraries, but the android-fooa.so is wrong, change the size from 5.6 Mb the original in my $(LIBRARY_PATH) to < 500 kbs in libs/armeabi-v7a, so the library is corrupted in launch process.
I have solved this, copying the library manually, and avoid using ndk-build in eclipse. If I use ndk-build, the library will be corrupted again.
Update:
Compiling with CMake
and installing the library into libs/armeabi-v7a can cause problems. So I installed prebuilt libraries with CMake into jni/prebuilt and added them in Android.mk
Using these likes for each prebuilt library must work:
# Prebuilt lib code
include $(CLEAR_VARS)
LOCAL_MODULE := android-foo
LOCAL_SRC_FILES := prebuilt/libandroid-foo.so
include $(PREBUILT_SHARED_LIBRARY)