如何使用NDK开发opencv ndroid平台应用
1、首先搭建基于NDK的jni开发环境,再次不在累述,请参考另一篇经验。
从官方下载OpenCV4Android SDK 3.0 开发包,并将该包解压。
2、解压opencv4android 包
选择file->import->Android->Existing Android code intoworkplace


3、浏览opencv 目录,导入所有工程,
注意勾选“Copy projects into workspace”
Copy openCV目录下SDK文件夹到工作区中



4、修改工程Tutorial 1 ->userSDK版本, 根据测试手机设置此版本,设置>=11即可

5、设置tutrorial 1 工程文件属性,加入opencv library


6、编译并运行apk, 手机能运行程序,但是会报package not found,这是因为程序依赖的文件没有安装,类似windows平台下找不到dll文件一样,这些依赖包在opencv目录apk目录下,安装对应平台的apk即可,但是这样动态链接给安装带来不便,以下介绍静态链接,把所需文件打包在一起。
幸运的是,这一步在oepncv 目录下产生库文件opencv library - 3.0.0.jar


7、设置工程属性,Java build path->Libraries->Add jars,执行了这一步操作,工程文件中会出现opencv library


8、修改AndroidMainifest.xml文件,加入
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
这里是设置应用程序的权限,接下来因为涉及文件操作,设置存储器访问权限,如要设置camera,可按照上述设置。

9、在Jni目录下 增加Application.mk文件,加入内容为,
#APP_STL := gnustl_static
#APP_CPPFLAGS := -frtti –fexceptions
APP_ABI := armeabi-v7a
10、同时修改Android.mk文件为:此配置选项是设置Opencv头文件路径,库文件连接方式,编译源文件及生成的库文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
OPENCV_INSTALL_MODULES:=on
include C:\Users\admin\workspace\sdk\native\jni\OpenCV.mk
LOCAL_MODULE := Hello
LOCAL_LDLIBS += -llog -ldl
LOCAL_SRC_FILES := Hello.cpp
include $(BUILD_SHARED_LIBRARY)
11、修改hello.cpp文件
//加入头文件
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
jstring JniString(JNIEnv* env) {
return env->NewStringUTF("Hello,NDK");
}
extern "C"
{
JNIEXPORT jstring JNICALL Java_com_example_hello_MainActivity_stringFromJNI(JNIEnv* env,jobject o){
完整代码如下:

12、向手机中丢入一个图片文件,路径为/storage/emulated/0/1.jpg
编译运行,have fun.
在应用程序中点击button, 将文件/storage/emulated/0/out.txt取出,
查看文件内容为: Hello,image size=1920 x 1200
这说明opencv已经正确加载,并执行opencv库中函数,另外,此时opencv是静态编译到应用程序中的。
如对读者有帮助,欢迎投宝贵一票,谢谢!
