1.目標(biāo)和步驟
(1)環(huán)境搭建
(1.1)ndk環(huán)境---走進(jìn)AndroidStudio下的NDK?
? ? 問題1:發(fā)現(xiàn)mk文件沒有自動(dòng)生成(如果不想手動(dòng)寫mk,可以做如下替換)
? ? 在項(xiàng)目的主目錄下./build.gradle替換build tools,使用gradle-experimental端幼,如下
? ? classpath"com.android.tools.build:gradle-experimental:0.7.0-alpha4"
? ? 替換插件
? ? 在gradle中不能再使用com.android.application了概耻,需要使用com.android.model.application替代睛榄。
? ?在項(xiàng)目主目錄下的./app/build.gradle中更改plugin
? ? apply plugin: “com.android.model.application”
? ? 相應(yīng)的gradle配置的依賴版本要改成2.10.0
? ? 可以參考 http://android.jobbole.com/83431/,但是我不想改我的gradle版本
我的解決方法:手工執(zhí)行命令經(jīng)行編譯,學(xué)習(xí)一下mk
在使用手工編譯(C/C++)文件之前返十,我們要回到文章開頭部分彭谁,我們需要配置好系統(tǒng)環(huán)境變量,這樣我們才能在系統(tǒng)環(huán)境下執(zhí)行ndk相關(guān)編譯命令共虑,如果您的環(huán)境變量還沒有配置愧怜,那么可以參考下文章開頭部分,如果已經(jīng)做好這部分工作妈拌,那么咱們繼續(xù)拥坛。
接下來蓬蝶,我們還要?jiǎng)?chuàng)建如下兩個(gè)文件:Android.mk 和 Applicatoin.mk (非必要)
創(chuàng)建Android.mk
Android.mk文件用來指定源碼編譯的配置信息,例如工作目錄猜惋,編譯模塊的名稱丸氛,參與編譯的文件等,大致內(nèi)容如下:
LOCAL_PATH:=? $(call my-dir)include$(CLEAR_VARS)LOCAL_MODULE:=? hello_jniLOCAL_SRC_FILES:=? hello_jni.cinclude$(BUILD_SHARED_LIBRARY)
LOCAL_PATH:設(shè)置工作目錄著摔,而my-dir則會(huì)返回Android.mk文件所在的目錄缓窜。
CLEAR——VARS:清除幾乎所有以LOCAL——PATH開頭的變量(不包括LOCAL_PATH)。
LOCAL_MODULE:用來設(shè)置模塊的名稱谍咆。
LOCAL_SRC_FILES:用來指定參與模塊編譯的C/C++源文件名禾锤。
BUILD_SHARED_LIBRARY:作用是指定生成的靜態(tài)庫或者共享庫在運(yùn)行時(shí)依賴的共享庫模塊列表。
創(chuàng)建Application.mk
這個(gè)文件用來配置編譯平臺(tái)相關(guān)內(nèi)容摹察,我們最常用的估計(jì)只是APP_ABI字段恩掷,它用來指定我們需要基于哪些CPU架構(gòu)的.so文件,當(dāng)然你可以配置多個(gè)平臺(tái):
APP_ABI := armeabi armeabi-v7a x86 mips
如果不創(chuàng)建Application.mk文件供嚎,那么手動(dòng)編譯的.so文件只有armeabi平臺(tái)一個(gè)版本黄娘,其他平臺(tái)的不會(huì)被編譯。
假設(shè)我們配置好了Android.mk文件克滴,那么接下來我們就可以執(zhí)行如下命令來生成.so文件了寸宏,我們假設(shè)開發(fā)NDK的目錄為默認(rèn)目錄:
cdsrc/main/jni/ndk-build
如果順利,那么你將會(huì)看到偿曙,在src/main/目錄下會(huì)多了一個(gè)libs目錄氮凝,這是NDK使用命令編譯.so文件的生成的默認(rèn)目錄,而AndroidSutdio默認(rèn)加載NDK的目錄是jniLibs望忆,那么你有兩種解決方式:
配置build.gradle資源目錄罩阵,參見文章2.1小節(jié)
使用ndk-build NDK_LIBS_OUT=../jniLibs指定具體的輸出目錄
當(dāng)你得到了.so文件,那么接下來就是在java文件中調(diào)用執(zhí)行即可启摄,如果想了解更多ndk-build命令內(nèi)容稿壁,可參見:Android ndk-build 使用文檔
(1.2)opencv環(huán)境?
這篇文章基本能解決大部分問題
Android開發(fā)配置opencv環(huán)境超詳細(xì)教程
這篇文章絕對(duì)手把手教會(huì)
Android Studio中通過CMake使用NDK并編譯自定義庫和添加預(yù)編譯庫
介紹了用CMake構(gòu)建的方法,用的版本和庫比較新
? ? 到了這一步歉备,應(yīng)該都能成功的配置出NDK環(huán)境并在上面使用opencv的接口傅是。
2.編譯Opencv源碼及生成android工程
經(jīng)過上面的步驟可以完成openCV環(huán)境的搭建,用C/C++或者java開發(fā)OpenCV的程序沒什么大問題了蕾羊,基于的庫是openCv的主干版本喧笔,問題是我們想加入擴(kuò)展包的物體追蹤的內(nèi)容構(gòu)建。
openCV的擴(kuò)展包地址如下:
https://github.com/opencv/opencv_contrib
如何將擴(kuò)展包和主干編譯到一起龟再,我到開源庫中提了問題
看到在官方的構(gòu)建中是有將opencv和contrib工程集體打包的構(gòu)建书闸,但是并沒有公開出來,然并卵利凑!
在本地如何整體編譯浆劲,有這個(gè)問題可以得到解答嫌术。
按照tzutalin那個(gè)哥們說法:(2)中build-opencv-for-android這個(gè)可以解決問題。估計(jì)在linux平臺(tái)上是可以的牌借,我這里用的是
mac度气,編譯會(huì)遇到各種坑,最后采用的是(1)中的方法
(1)下載opencv源碼和opencv_contrib源碼
? ? midir opencvProject
? ? cd opencvProject/
? ? git clone https://github.com/opencv/opencv_contrib.git
? ? git clone https://github.com/opencv/opencv.git
(2)用Cmake進(jìn)行編譯
? ? 額沒有下載cmake, 先下載安裝cmake, 推薦使用brew工具下載安裝
? ? cd opencv
? ? mkdir release
? ? cd ?release
? ? cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/CMAKE_BUILD_TYPE=RELEASE - ? ?DCMAKE_INSTALL_PREFIX=/usr/local ..
? ? make -j8
? ? sudo make install
? ? 等吧膨报,我們不缺時(shí)間不要優(yōu)化
(3)編譯生成Android工程
? ? 回到opencvProject這個(gè)目錄蚯嫌,看到里面有下好了的倆個(gè)工程opencv和opencv_contrib
? ? 下載這位哥寫好的腳本進(jìn)行編譯
? ? git clone https://github.com/tzutalin/build-opencv-for-android.git
? ? ./build-android-opencv.sh
? ? 編譯的時(shí)候遇到一個(gè)錯(cuò)誤,readlink: illegal option -- f丙躏,解決方案是這篇文章
然后把腳本中的readlink改為greadlink择示,
### ABIs setup中把a(bǔ)rmeabi-v7a with NEON加上,這樣可以生成不同系統(tǒng)對(duì)應(yīng)的so庫
declare -a ANDROID_ABI_LIST=("x86" "x86_64" "armeabi" "armeabi-v7a with NEON")
再次運(yùn)行晒旅,OK了
3.使用
編譯出來生成android_opencv的文件夾工程栅盲,使用方法和2種講的一致。