Search code examples
androideclipseandroid-ndkjava-native-interfacecmake

Unexpected e_type: 1 Linking release library using JNI + CMake + Android.mk


I work with JNI compiling main cross-platform library with CMake that compile all libraries in a library path.

  • My project use 2 dynamic libraries (libfoo.so need libandroid-fooa.so) and some static dependencies, correctly encapsuled.
  • 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.


Solution

  • 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)