【问题标题】:Native OpenCV in Android UnsatisfiedLinkError libopencv_java.so not foundAndroid UnsatisfiedLinkError libopencv_java.so 中的本机 OpenCV 未找到
【发布时间】:2014-09-16 12:53:38
【问题描述】:

我看过类似的帖子,但没有一个给出正确答案。

设置:

Linux Ubuntu 14.04
Android NDK r8e
Boost 1.53
OpenCV 2.4.9

编译时我收到了这个警告:

Compile++ thumb  : usit <= wahet.cpp
SharedLibrary  : libusit.so
/home/tassilo/android-ndks/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol '__aeabi_atexit' in /home/tassilo/android-ndks/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO jni/opencv/sdk/native/jni/../libs/armeabi-v7a/libopencv_java.so
Install        : libusit.so => libs/armeabi-v7a/libusit.so

我还没有尝试调用我的 C++ 代码,我所做的只是创建导致此错误的库:

09-16 14:34:59.189: V/IRISREC(654): Native code library failed to load.
09-16 14:34:59.189: V/IRISREC(654): java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]:    36 could not load needed library 'libopencv_java.so' for 'libusit.so' (load_library[1091]: Library 'libopencv_java.so' not found)

这是我的 Android.mk

LOCAL_PATH := $(call my-dir)
NDK_ROOT := /home/tassilo/android-ndks/android-ndk-r8e


include $(CLEAR_VARS)

include ./jni/opencv/sdk/native/jni/OpenCV.mk

LOCAL_MODULE           := usit
LOCAL_SRC_FILES        := wahet.cpp

LOCAL_C_INCLUDES:= ./jni/opencv/sdk/native/jni/include
LOCAL_CFLAGS += -I$(LOCAL_PATH)/boost/include/boost-1_53
LOCAL_LDLIBS += -L$(LOCAL_PATH)/boost/lib/ -lboost_system-gcc-mt-1_53 -lboost_regex-gcc-mt-1_53 -lboost_filesystem-gcc-mt-1_53 -lboost_date_time-gcc-mt-1_53 \
-L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi \
-lgnustl_static \
-L$(SYSROOT)/usr/lib -llog

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_PLATFORM          := android-8
APP_ABI               := armeabi-v7a
APP_OPTIM             := debug
NDK_DEBUG             := 1

NDK_TOOLCHAIN_VERSION := 4.6
APP_STL               := gnustl_static
APP_CPPFLAGS          := -fexceptions -frtti

库加载到我的 MainAcitvity.java

static {
    try {
        System.loadLibrary("usit");
    } catch (UnsatisfiedLinkError e) {
        Log.v(TAG, "Native code library failed to load.\n" + e);
    } catch (Exception e) {
        Log.v(TAG, "Exception: " + e);
    }
}

所以错误是在我的第一个 catch 块中引发的。 需要的库文件在我的文件夹里

./jni/opencv/sdk/native/libs/ -armeabi/ -armeabi-v7a etc.

几天以来我一直在处理所有这些问题。感谢任何帮助。

【问题讨论】:

    标签: android c++ opencv boost android-ndk


    【解决方案1】:

    关于hidden symbol '__aeabi_atexit'opencv.org 上的answer 建议使用gnustl_shared 而不是gnustl_static

    这符合我对 opencv_java 的个人经验,意味着 Java 代码必须相应更改:

    static {
        try {
            System.loadLibrary("gnustl_shared"); // added
            System.loadLibrary("opencv_java");
            System.loadLibrary("usit");
        } catch (UnsatisfiedLinkError e) {
            Log.v(TAG, "Native code library failed to load.\n" + e);
        } catch (Exception e) {
            Log.v(TAG, "Exception: " + e);
        }
    }
    

    Android.mk

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    OPENCV_INSTALL_MODULES:=on
    include ./jni/opencv/sdk/native/jni/OpenCV.mk
    
    LOCAL_MODULE           := usit
    LOCAL_SRC_FILES        := wahet.cpp
    
    LOCAL_C_INCLUDES := \
      $(LOCAL_PATH)/opencv/sdk/native/jni/include \
      $(LOCAL_PATH)/boost/include/boost-1_53
    
    LOCAL_LDLIBS += -L$(LOCAL_PATH)/boost/lib/ \
      -lboost_system-gcc-mt-1_53 \
      -lboost_regex-gcc-mt-1_53 \
      -lboost_filesystem-gcc-mt-1_53 \
      -lboost_date_time-gcc-mt-1_53 \
      -llog
    
    include $(BUILD_SHARED_LIBRARY)
    

    Application.mk

    APP_PLATFORM          := android-8
    APP_ABI               := armeabi-v7a
    APP_OPTIM             := debug
    NDK_DEBUG             := 1
    
    NDK_TOOLCHAIN_VERSION := 4.6
    APP_STL               := gnustl_shared
    APP_CPPFLAGS          := -fexceptions -frtti
    

    【讨论】:

    • 09-16 15:04:59.749: V/IRISREC(979): Native code library failed to load. 09-16 15:04:59.749: V/IRISREC(979): java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null
    • 你有没有看我在编译时收到的警告?或许与此有关
    • 也试过了。现在我收到了类似09-17 11:51:48.318: V/IRISREC(22294): java.lang.UnsatisfiedLinkError: Couldn't load opencv_java from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.irisrec-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.irisrec-1, /vendor/lib, /system/lib]]]: findLibrary returned null 的错误,gnustl_shared 也一样。因此,我尝试在我的 Application.mk 中将 `APP_STL := gnustl_static` 替换为 `APP_STL := gnustl_shared`,并将其从 Android.mk 中删除。现在只有 gnustl_shared 错误消失了。
    • 嘿,我刚刚发现我在设备(Android)和模拟器上有不同的错误。在模拟器(Android 4.0)中,它与我的第一条评论中的错误相同。我还在 Application.mk 中添加了 armeabi,以确保支持我的 SGS4 (Android 4.4)。
    • 否 :( 这是我现在在评论中发布的第二个错误。作为我的朋友推荐的,我只是尝试将 opencv_java.so 复制到 data/data/my.app/libs 和 system/ lib,但两者都不能正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多