参考链接:
http://blog.csdn.net/pocoyoshamoo/article/details/23533923
http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html
http://blog.csdn.net/yanzi1225627/article/details/27863615
注:以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量...
下面讲到的环境配置无需单独下载CDT以及Cygwin:
Step1:配置ADT开发环境(略)。
Step2:下载最新的NDK。
到Android官网下载最新的NDK,注:NDK版本在r7以上之后就集成了Cygwin,而且还是十分精简版。比起下载Cygwin要方便多啦!下载链接见:
http://developer.android.com/tools/sdk/ndk/index.html,当前最新版本为android-ndk-r10d。
下载完成之后,解压到自定义目录,例如:D:\00_dev\android-ndk-r10d
Step3:在Eclipse中配置NDK路径。
打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径,例如D:\00_dev\android-ndk-r10d,并配置环境变量NDKROOT。
Step4:为Android Project添加本地库
新建一个Android工程,在工程上右键点击Android Tools->Add Native Support...,然后给我们的.so文件取个名字,例如: HelloOpenCV。
这时候工程就会多一个jni的文件夹,jni下有Android.mk和HelloOpenCV.cpp文件。Android.mk是NDK工程的Makefile,HelloOpenCV.cpp就是NDK的源文件。
Step5:在Eclipse中配置NDK编译方式。
设置NDK的编译方式。选择Project->Properties,选中C/C++ Build,去掉Use default…前面的勾,选择之前配置好的NDKROOT环境变量,并在${NDKROOT}后面添加/ndk-build,构成${NDKROOT}/ndk-build,点击确定。
Step6:在Eclipse中声明本地方法,并生成JNI接口函数声明。
新建一个NativeFunctions类,用于声明native方法,加载HelloOpenCV库,如下图所示。
进入Windows命令提示符窗口,先cd到NativeFunctions所在的工程目录的src目录,首先键入javac com\example\helloopencv\NativeFunctions.java命令,生成NativeFunctions.class文件;
再键入javahcom.example.helloopencv.NativeFunctions命令,生成com_example_helloopencv_NativeFunctions.h文件:
Step7:在Eclipse中配置C/C++的Include路径。
重新切换到Eclipse,刷新Project,在src目录下多出com_example_helloopencv_NativeFunctions.h文件,如下图:
打开后发现程序报错,提示以下错误:
这是因为当前项目未Include NDK的JNI:D:\00_dev\android-ndk-r10d\platforms\android-19\arch-arm\usr\include路径。
选择Project->Properties->C/C++General->Paths and Symbols,添加路径D:\00_dev\android-ndk-r10d\platforms\android-19\arch-arm\usr\include,并一定要勾选Add to all languages选项,确保该设置对c、cpp均生效,至于All to all configurations,可选可不选,点击确定,ndk 的jni就可以用了。若错误提示未消失,按Ctrl+B快捷键编译一下Workspace后错误才消失。
Step8:在jni文件夹下的C/C++源文件中编写函数实现体。
接下来仿着NDK的demo,Hello-JNI工程写一下。使用Alt + '/'可以代码提示!
JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_代替) + _ + 调用该接口的类名 + _ + 方法名,对于实例方法,有两个参数是必要的,一个JNI的环境指针JNIEnv *,另一个是调用该方法的Java实例jobject或jclass。
JNI函数接口可以我们按照其命名规范手工编辑而来,也可以通过上一步骤自动生成,为方便之后C/C++代码的编写,我们将上一步生成的com_example_helloopencv_NativeFunctions.h文件Move到jni文件夹下,并重命名为HelloOpenCV.h,在HelloOpenCV.cpp中增加头文件#include <HelloOpenCV.h>,这时就可以在HelloOpenCV.cpp编写JNIEXPORTjstringJNICALL Java_com_example_helloopencv_NativeFunctions_getHelloString (JNIEnv *,jclass)的函数体了。
Step9:在Activity中添加调用本地方法的代码。
在Activity中添加如下代码:
Step10:编译运行。
编译运行,得到如下结果: