我有一个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添加到项目中?
答案 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