使用OpenCV和Android NDK找不到库(但在其他活动中找到)

时间:2013-02-17 18:31:31

标签: android eclipse opencv android-ndk unsatisfiedlinkerror

我已经浏览了大量资源(包括但不限于OpenCV4Android's Google group,StackOverflow和OpenCV's answers页面试图解决此问题,达到建议变得多余的程度。问题可能是或多或少类似于我之前的(尚待解决的)question,但是情况不同,因而可能是不同的错误来源。

我已经将一个Android Activity添加到包含成功运行的应用程序的包中(OpenCV的教程3示例演示了ndk使用)。该活动使用OpenCV的java API,但调用System.loadLibrary("nativefile");,其中nativefile表示本机库。调用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的模式验证它是否包含包名称和类名称以及方法名称。 Morever;代码在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

  • 我尝试用all替换APP_ABI行中的armeabi,并再次尝试使用armeabi-v7a,但是没有不同的结果。

  • 我还根据评论here的建议验证了apk(在解压缩后)包含各种架构类型文件夹下.so文件夹中所需的lib文件
  • 下面是BaseLoaderCallBack实例化块,与OpenCV示例中的不同,但是我没有调用OpenCV摄像头,因为应用程序对从SD卡读取的图像执行图像处理。 / p>

     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的示例不同,在相关活动中,行loader.onManagerConnected(LoaderCallbackInterface.SUCCESS);已添加到onCreate()方法,因为方法onManagerConnected似乎没有被调用。

  • 在每个OpenCV语句块之前,检查条件if (OpenCVLoader.initDebug())。我也尝试了recommended OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, loader)条件检查,但结果仍然没有。
  • 此外,ndk-build成功运行构建本地库.so的{​​{1}}个文件。

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

我多次检查了OpenCV样本,并按照相同的做法进行了轻微的差异,如上所述。

任何想法可能是问题的根源?

感谢您的时间。

0 个答案:

没有答案