Android开发:安装NDK,移植OpenCV2.3.1,JNI调用OpenCV全过程

最后更新于:2022-04-01 07:23:53

开发环境:Fedora14 , 操作中以root权限操作,这年头Android移植上OpenCV就强大了,可以做很多复杂的视频分析、图像处理工作了!如火灾、人脸、视频行为的分析等。欢迎Android OpenCV爱好者,加入OpenCV4Android联盟群:66320324。备注:yanzi **一:NDK的安装**     首先是安装NDK,安装之前需要安装CDT,具体的参照[http://blog.csdn.net/yanzi1225627/article/details/7736364](http://blog.csdn.net/yanzi1225627/article/details/7736364)这里来完成。这里再详细记录下NDK的安装过程。google下载NDK,也可以点击这里下载:http://download.csdn.net/detail/yanzi1225627/5015893,下载后输入tar -jxvf android-ndk-r8-linux-x86.tar.bz2 -C /usr/local/android/将其解压到/usr/local/android/ 目录。『注,我的android相关文件都安装在这里。这个目录不是死的。』然后gedit /etc/profile,在里面添加:export PATH=$PATH:/usr/local/android/android-ndk-r8,从安装JDK到eclipse, android, NDK,在/etc/profile文件里,添加的命令一共有如下三条: export JAVA_HOME=/usr/local/android/jdk1.7.0_04 export PATH=$PATH:$JAVA_HOME/bin export PATH=$PATH:/usr/local/android/android-ndk-r8 只要这三条就行了。然后source /etc/profile  使刚才的设置生效。 在终端里输入:ndk-build,可以测试出ndk安装成功了么有。    注:有的时候也可以通过在线安装方式,在eclipse里点help-install new software,网址输入这个:ADT - https://dl-ssl.google.com/android/eclipse/,也会看到安装NDK Plugins, 如果经过上面的步骤,NDK不能用就把这个也装上。 但如果只装这个,好像不中,找不到ndk安装的目录,也无法配置路径。 **二:OpenCV的移植**      这里的移植不是像在qt下那么麻烦,这是因为OpenCV退出来直接支持Android的版本,所以不需要自己编译。直接下下来,解压缩就可以了。我用的OpenCV2.3.1,需要的可以直接到csdn资源里下载,链接:[http://download.csdn.net/detail/yanzi1225627/5013701](http://download.csdn.net/detail/yanzi1225627/5013701),也可以自己到sourceforge上下载,链接:http://sourceforge.net/projects/opencvlibrary/files/opencv-android/,从这里可以看出从OpenCV2.3开始就有编译好的android版本。最新的是2.4.3版本,在2012年12月24发布的。牛逼阿!    接下来就是配置。事实上有两种方法在Android里调用OpenCV,一种是使用OpenCV java Api,一种是通过JNI的方式。这里是针对后者。将OpenCV-2.3.1-android-bin.tar.bz2解压缩,然后将里面的OpenCV-2.3.1拷贝到Eclipse工作空间的平级目录。图示: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21abeac19.png)        为此,我们现先建一个工作空间。新建文件夹/home/yan/TestOpenCV,点eclipse里的File---Switch workspace---other,选中这个目录。切换到这个工作空间后,点Window---Preference--android,选中自己的android-sdk的安装目录,我的是:/usr/local/android/android-sdk-linux。然后就可以在这个工作空间里正常android开发了,如果不设置这个,新建的工程全是红叉叉。      新建一个项目HaveImgFun,包名是package com.testopencv.haveimgfun; 然后将刚才解压缩出来的**OpenCV-2.3.1-android-bin\samples"下的includeOpenCV.mk文件拷贝到和项目HaveImgFun同一级目录**中。图示: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21ac095a3.png) 在 eclipse里选中那个项目,新建一个文件夹jni,然后新建文件:Android.mk,里面的内容是: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) include ../includeOpenCV.mk ifeq ("$(wildcard $(OPENCV_MK_PATH))","") #try to load OpenCV.mk from default install location include $(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk else include $(OPENCV_MK_PATH) endif LOCAL_MODULE    := ImgFun LOCAL_SRC_FILES := ImgFun.cpp include $(BUILD_SHARED_LIBRARY)  再新建一个Application.mk, 内容输入: APP_STL:=gnustl_static APP_CPPFLAGS:=-frtti -fexceptions APP_ABI:=armeabi armeabi-v7a 然后新建一个cpp文件,ImgFun.cpp, 这个测试程序是将一个图片的上半部分弄黑,然后复原。具体的大家看源码。功能很简单。 内容是: #include <jni.h> #include <stdio.h> #include <stdlib.h> #include <opencv2/opencv.hpp> using namespace cv; extern "C" { JNIEXPORT jintArray JNICALL Java_com_example_haveimgfun2_LibImgFun_ImgFun(      JNIEnv* env, jobject obj, jintArray buf, int w, int h); JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(      JNIEnv* env, jobject obj, jintArray buf, int w, int h){  jint *cbuf;  cbuf = env->GetIntArrayElements(buf, false);  if(cbuf == NULL)  {      return 0;  }  Mat myimg(h, w, CV_8UC4, (unsigned char*)cbuf);  for(int j=0; j<myimg.rows/2; j++)  {      myimg.row(j).setTo(Scalar(0, 0, 0, 0));  }  int size=w*h;  jintArray result = env->NewIntArray(size);  env->SetIntArrayRegion(result, 0, size, cbuf);  env->ReleaseIntArrayElements(buf, cbuf, 0);  return result; } } ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21ac16d50.png)     然后在终端里切换到HaveImgFun目录,也就是在目录/home/yan/TestOpenCV/HaveImgFun下, 终端输入**ndk-build**, 会生成相应的库。 具体的大家下载源程序把!下载连接:[http://download.csdn.net/detail/yanzi1225627/5016365](http://download.csdn.net/detail/yanzi1225627/5016365) 【注,下载后将文件解压。然后eclipse里,切换到TestOpenCV空间,点File--import,就可以了。首先测下最后一步,也就是输入ndk-build, 会不会生成相应的库!】 参考:[http://www.cnblogs.com/ldr213/archive/2012/02/20/2359262.html](http://www.cnblogs.com/ldr213/archive/2012/02/20/2359262.html)
';