到现在为止,在android上使用opencv已经接触过了一段时间,最近又加了个小功能,所以又熟悉了一边这个过程。用的是opencv2.4.0,发现比以前方便了些。
记下了主要步骤,方便以后复查吧~~
elipse、ADT、android sdk这三个名词弄完以后就可以开发android项目了,此处不是重点,略过。
cygwin、ndk这两个名词弄完以后就可以在android项目中添加本地调用c语言的程序,此处不是重点,略过。步入正题,在android项目中添加opencv程序开发的功能模块。
1 首先下载编译好的android-opencv(http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.4.0/)
2 在eclipse中新建一个android项目ArtDemo。添加一个类GoodCut,主要是定义功能函数接口。如下
package com.souxieke;
public class GoodCut {
static {
System.loadLibrary("GoodCut");
}
public static native int[] Process(String imgPath, int x1,int y1,int x2,int y2);
}
com.souxieke这个包的层级要搞清楚,以后写cpp文件中函数名要与这个完全对应。
3 把下载的android-opencv解压,把其中的OpenCV-2.4.0文件夹拷贝到你的eclipse项目空间同级目录下,把其中OpenCV-2.4.0\share\OpenCV\OpenCV.mk拷贝
到你的android项目ArtDemo同级目录下,即eclise项目空间,布局如下图(这些位置一定要这样,否则编译cpp文件时会出错)。
4 进入android项目ArtDemo,新建jni目录。在jni下新建三个文件Android.mk和Application.mk,和自己的c功能模块实现文件(此处我新建了一个名为
GoodCut.cpp的文件)。文件中内容分别如下,Android.mk和Application.mk两个文件中内容有一定的规则。
/*
* Android.mk
*/
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
OPENCV_INSTALL_MODULES:=on
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 := GoodCut
LOCAL_SRC_FILES := GoodCut.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
/*
* Application.mk
*/
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
/*
* GoodCut.cpp
*/
#include <jni.h>
#include <opencv2/opencv.hpp>
#include <cmath>
using namespace std;
using namespace cv;
extern "C" {
JNIEXPORT jintArray JNICALL Java_com_souxieke_GoodCut_Process(JNIEnv* env, jobject obj, jstring imgSrc,jint x1,jint y1,jint x2,jint y2);
JNIEXPORT jintArray JNICALL Java_com_souxieke_GoodCut_Process(JNIEnv* env, jobject obj, jstring imgSrc,jint x1,jint y1,jint x2,jint y2) {
//此处省略函数实现部分,感兴趣的话email:zsoftdevelop@163.com
}
}
注:(1)GoodCut.cpp文件中Java_com_souxieke_GoodCut_Process要与ArtDemp中GoodCut类信息相对应
(2)Adnroid.mk文件中LOCAL_MODULE := GoodCut LOCAL_SRC_FILES := GoodCut.cpp要与GoodCut文件名和GoodCut类中System.loadLibrary("GoodCut");
相对应
5 打开cygwin,进入android项目ArtDemo目录,$ndk/ndk-build开始编译cpp文件,编译通过后会生成libs\armeabi-v7a\libGoodCut.so,有了这个so,就可以在
android程序中调用c语言功能模块了。
注:此处$ndk/ndk-build前提是要在cygwin的home\username\.bash_profile中添加ndk的路径
ndk=/cygdrive/d/android/android-ndk-r8b
export ndk
ok!