1. 程式人生 > >Android開發:安裝NDK,移植OpenCV2.3.1,JNI呼叫OpenCV全過程

Android開發:安裝NDK,移植OpenCV2.3.1,JNI呼叫OpenCV全過程

開發環境:Fedora14 , 操作中以root許可權操作,這年頭Android移植上OpenCV就強大了,可以做很多複雜的視訊分析、影象處理工作了!如火災、人臉、視訊行為的分析等。歡迎Android愛好者,加群:248217350。備註:yanzi

一:NDK的安裝

首先是安裝NDK,安裝之前需要安裝CDT,具體的參照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,也可以自己到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工作空間的平級目錄。圖示:

為此,我們現先建一個工作空間。新建資料夾/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同一級目錄中。圖示:

在 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;
}

}

然後在終端裡切換到HaveImgFun目錄,也就是在目錄/home/yan/TestOpenCV/HaveImgFun下, 終端輸入ndk-build, 會生成相應的庫。
具體的大家下載源程式把!下載連線:
http://download.csdn.net/detail/yanzi1225627/5016365

【注,下載後將檔案解壓。然後eclipse裡,切換到TestOpenCV空間,點File--import,就可以了。首先測下最後一步,也就是輸入ndk-build, 會不會生成相應的庫!】