1

我已经浏览了无数资源(包括但不限于OpenCV4Android 的 Google 小组、StackOverflow 和OpenCV 的答案页面试图解决这个问题,达到了建议变得多余的地步。这个问题可能或多或少类似于以前的(尚未解决)我的问题,但情况不同,因此可能是不同的错误来源。

我已将 Android Activity 添加到包含成功运行的应用程序的包中(OpenCV 的教程 3 示例演示了 ndk 的使用)。该活动使用 OpenCV 的 java API,但调用System.loadLibrary("nativefile");wherenativefile表示本地库。loadLibrary下面提到了调用的块;它在onManagerConnected()方法中。在这一loadLibrary行,Logcat 发出:

02-17 19:27:39.239: E/AndroidRuntime(10872): FATAL EXCEPTION: main
02-17 19:27:39.239: E/AndroidRuntime(10872): java.lang.UnsatisfiedLinkError: Library nativefile not found
02-17 19:27:39.239: E/AndroidRuntime(10872):    at java.lang.Runtime.loadLibrary(Runtime.java:461)
02-17 19:27:39.239: E/AndroidRuntime(10872):    at java.lang.System.loadLibrary(System.java:557)

这种错误确实在其他问题中多次出现;我已经尝试了我遇到的建议。但是,对这个问题有一个值得注意的观察;成功运行的应用程序(OpenCV 示例)通过System.loadLibrary("nativefile");.

代码相当长,因此对问题没有帮助。但是,下面总结了我认为与该问题有关的关键要素,它还总结了与该问题相关的一些先前的答案。

  • 调用的 .cpp 文件具有正确的方法名称,我在其中验证它是否包含包名称和类名称以及方法名称,其模式类似于:Java_packageNameSeperatedWithUnderScores_callingClassName_methodName. 此外;代码被包围在一个extern "C"块中,与其他用于本地开发的 OpenCV 示例 cpp 文件一样。
  • 更新 Android 清单以了解它启动了相关活动。
  • 下面是Android.mk文件:

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
    include ../../sdk/native/jni/OpenCV.mk LOCAL_MODULE := nativefile
    LOCAL_SRC_FILES := nativefile.cpp
    LOCAL_LDLIBS += -llog -ldl
    include $(BUILD_SHARED_LIBRARY)

  • 下面是Application.mk文件

    APP_STL := gnustl_static
    APP_CPPFLAGS := -frtti -fexceptions
    APP_ABI := all

  • 我试过用 替换allAPP_ABI再次armeabi尝试用armeabi-v7a,但是没有不同的结果。

  • 正如评论中所建议的,我还验证了 apk(在提取后)在各种架构类型文件夹下的.so文件夹中包含所需的文件。lib
  • 下面是BaseLoaderCallBack实例化块,与 OpenCV 示例中的块没有太大不同,但是我不调用 OpenCV 相机,因为该应用程序对从 SD 卡读取的图像执行图像处理。

     BaseLoaderCallback loader = new BaseLoaderCallback(this){
     public void onManagerConnected(int status){  
        switch(status){     
            case LoaderCallbackInterface.SUCCESS:{ 
                 System.loadLibrary("nativefile"); break; }  
            default:{  
                 super.onManagerConnected(status); break; }  
        } } };
    
  • 然而,与 OpenCV 的示例不同,在有问题的 Activity 中,该行loader.onManagerConnected(LoaderCallbackInterface.SUCCESS);被添加到onCreate()方法中,因为该方法onManagerConnected似乎没有被调用。

  • 在每个 OpenCV 语句块之前,都会if (OpenCVLoader.initDebug())检查条件。我也尝试了推荐 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, loader)的条件检查,但仍然没有不同的结果。
  • 此外,ndk-build 运行成功.so,为本机库构建文件nativefile

鉴于在同一个包中的其他活动,加载库并很好地利用它(当然在相应地修改清单文件和 cpp 方法名称之后),我认为项目属性是正确的(例如添加 OpenCV 库和必要的环境路径等)。

我多次查看了 OpenCV 示例,并遵循了相同的做法,但略有不同,如上所述。

有什么想法可能是问题的根源吗?

感谢您的时间。

4

0 回答 0