OpenCV 2.4.1:UnsatisfiedLinkError

时间:2012-06-05 08:59:55

标签: java android opencv android-ndk java-native-interface

我有一个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。

如何编译而不将此lib添加到项目中?

2 个答案:

答案 0 :(得分:7)

除了C ++ OpenCV接口的JNI包装器之外, 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

答案 1 :(得分: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步:Application Development with Static Initialization