之前讲的只是Android通过JNI接口调用自定义的C/C++函数,接下来我们需要调用的是OpenCV的库函数。
Step1:下载OpenCV-2.4.10-android-sdk。
下载之后解压缩至自定义目录即可,例如:D:\00_dev\OpenCV-2.4.10-android-sdk。
Step2:在Android.mk文件中包含OpenCV-2.4.10-android-sdk的OpenCV.mk。并添加相关配置信息。
下面逐一解释一下各参数:
1-OPENCV_INSTALL_MODULES:=on 自动依赖OpenCV的so库,主要是libopencv_java.so;
2-OPENCV_CAMERA_MODULES:=off 表示无需将带camera的so拷贝至工程下的libs文件夹下;
3-OPENCV_LIB_TYPE:=STATIC 使用静态的OpenCV库。
4-includeD:\AndroidSoftwares\OpenCV-2.4.10-android-sdk\sdk\native\jni\OpenCV.mk opencv4android中包含了opencv.mk这样的一个make文件,这个文件对于编译本地opencv代码是非常重要的,如果你不想用opencv4android的SDK,但是也要把这个SDK中的opencv.mk这个文件复制到你的opencv目录或者其他目录,将来在 Android程序中配置NDK本地编译的时候需要使用这个文件。非常重要。
关于这些参数的设置,可以进一步参考网址:
http://blog.csdn.net/yanzi1225627/article/details/27863615
Step3:配置Application.mk。
Application.mk描述了应用程序需要哪些动态库和静态库。常用设置如下:
APP_STL :=gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI :=armeabi-v7a
APP_PLATFORM :=android-8
至于为什么这样设置,留待以后深入研究。
Step4:设置C/C++路径。
此时的路径可以参见opencv Sample 下的project的设置。projectproperties->c/c++ general->paths and Symbol->include->includedirectories,然后ADD几个必要的路径(以后也可根据需要再添加),其中NDKROOT= D:\AndroidSoftwares\android-ndk-r10:
1-${NDKROOT}/platforms/android-9/arch-arm/usr/include[包含<jni.h>、<math.h>、<string.h>等]
2-${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include
3-${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
以上两个包含C++的相关头文件,例如<string>
4-${ProjDirPath}/../../sdk/native/jni/include或绝对路径D:\AndroidSoftwares\OpenCV-2.4.10-android-sdk\sdk\native\jni\[包含opencv和opencv2]
如下图:
有时,系统也会自动为我们添加其他版本的路径,如下图:
至此,Opencv android project配置完毕,Opencv 的native库就可以用了。
Step5:在NativeFunctions中新增一个native方法。
Step6:在命令提示符窗口中键入命令,生成包含JNI接口方法声明的文件。
Step7:将上一步新生成的JNI接口声明拷贝到jni目录下,并重命名为HelloOpenCV.h。
Step8:在HelloOpenCV.cpp中编写函数实现体。
首先,包含头文件HelloOpenCV.h。
在编写函数体时,根据需要也许加入相应的头文件。
例如,添加Matin = imread("/sdcard/lena.jpg");这一句代码前,要事先包含
#include <opencv2/opencv.hpp>
usingnamespacecv;
再如,添加Canny(in,out,150,220); 这一句代码前,要事先包含
#include <opencv2/imgproc/imgproc.hpp>
注意:这里涉及到sdcard的读写,因此要再AndroidManifest.xml文件中添加权限。
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Step9:在Activity中调用该本地方法。
Step10:运行程序。
Step11:遇到的问题及解决方案。
1-若JNI编译通过,而项目仍然有错时,需切换到Eclipse的控制台查看错误信息,若出现“conversion to dalvik format failed with error 1”的错误,解决方案是清空bin、libs、obj等目录后重新编译,或删除多余的jar包。
也可参考网址:
http://www.tuicool.com/articles/uqMr6r