6

我有一个 android 项目,它有本机代码。在本机部分,我使用 OpenCV。当我使用 OpenCV 2.3.1 时,一切都可以编译并且工作正常,但是当我尝试切换到 2.4.1 版本时,我遇到了问题:

它编译没有任何错误,但是当我启动我的应用程序时,由于 UnsatisfiedLinkError,它无法加载我的库。

Cannot load library: link_image[1936]:    37 could not load needed library 'libopencv_java.so' for 'mylibrary.so' (load_library[1091]: Library 'libopencv_java.so' not found)

我看到 Open CV 尝试加载 libopencv_java.so,但我不需要它,而且我不在 java 代码中使用 OpenCV。这个图书馆的大小> 5M。

如何在不将此库添加到项目的情况下进行编译?

4

2 回答 2

7

除了 JNI 包装器到 C++ OpenCV 接口之外,libopencv_java.so 还包含所有 OpenCV 本机代码
当您使用适用于 Android 的 OpenCV 2.4 构建 JNI 库时,您可以使用libopencv_java.so (默认选项)动态链接并将其包含到您的 APK 中,或者通过显式添加此选项来静态链接:

include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
include <your path>/OpenCV.mk
于 2012-06-05T12:12:15.580 回答
1

当我从 2.3 升级到 2.4 时,以下变体对我有用(如果您的应用程序中有 JNI 部分,请遵循说明。底部链接中的详细信息。):

1/ 替换 Android.mk 中的路径,以便 OpenCV.mk 链接仍然有效(在 2.4 中它位于 native/jni/ 而不是 share/OpenCV/ 中)。

2/ 然后在包含 OpenCV.mk 之前写下这个:

OPENCV_INSTALL_MODULES:=on 
(this copies libopencv_java.so to your project's lib folder)

您也可以复制其他库(例如底部链接中使用的 OPENCV_CAMERA_MODULES)

3/ 之后,在 Activity 类的静态部分中,您可以加载库(在依赖它的其他人之前加载库):

System.loadLibrary("opencv_java"); 
(this loads libopencv.so)

或者:

if (!OpenCVLoader.initDebug()) {
    // Handle initialization error
})

(第二个看起来更干净,但我还没有尝试过)

源(对于部分)是链接中的第 3 步和第 4 步:使用静态初始化的应用程序开发

于 2013-06-26T01:37:11.980 回答