我已经浏览了无数资源(包括但不限于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我试过用 替换
all
并APP_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 示例,并遵循了相同的做法,但略有不同,如上所述。
有什么想法可能是问题的根源吗?
感谢您的时间。