Android Studio中使用jni進(jìn)行opencv開(kāi)發(fā)的環(huán)境配置方法
使用jni進(jìn)行opencv開(kāi)發(fā)可以快速地將PC端的opencv代碼移植到手機(jī)上,但是如何在android studio下進(jìn)行配置,網(wǎng)上幾乎找不到教程,大多都是eclipse下使用mk文件的方法,找不到使用gradle的方案,摸了幾天,總算是摸清楚了。
其實(shí)找對(duì)了方法,用android studio配置環(huán)境要比eclipse簡(jiǎn)單很多,首先是預(yù)先準(zhǔn)備的環(huán)境:
1.Android studio,官網(wǎng)最新版,我用的是2.3.1;
2.OpenCV4Android,官網(wǎng)最新版,我用的3.2.0;
就這兩個(gè)就行了,不需要像eclipse一樣手動(dòng)配置jni啊adt啊一堆有的沒(méi)的。
配置步驟如下:
【1.新建項(xiàng)目】

選中"Include C++ support",后面無(wú)腦next,Android會(huì)幫你把jni環(huán)境直接配置好。等gradle build完畢,可以在project窗口的Android標(biāo)簽頁(yè)下看到有External Build Files,下面是一個(gè)CMakeList.txt文件,這個(gè)是Android Studio自動(dòng)生成的一個(gè)makefile,相當(dāng)于用cmake編譯jni的部分,如果你cmake用得很熟練,那么只要在這個(gè)文件里配置好opencv的路徑,再在gradle里加點(diǎn)參數(shù)就可以輕松搞定,具體過(guò)程如下:
【2.編輯CMakeList.txt】
在CMakeList.txt中增加如下條目:
#項(xiàng)目路徑和opencv路徑
set(pathToProject D:/ImageProcess/JniExample)
set(pathToOpenCv D:/OpenCV-android-sdk)
#支持-std=gnu++11
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#配置加載native依賴(lài)
include_directories(${pathToOpenCv}/sdk/native/jni/include)
#動(dòng)態(tài)方式加載
add_library( lib_opencv SHARED IMPORTED )
#引入libopencv_java3.so文件
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
可以看到配置里有一個(gè)${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so文件,我們暫時(shí)還沒(méi)有,需要我們手動(dòng)創(chuàng)建相應(yīng)的jniLibs目錄,這個(gè)目錄會(huì)被Android Studio自動(dòng)識(shí)別作為編譯jni代碼時(shí)的庫(kù)目錄。

創(chuàng)建好如圖的目錄以后,將OpenCV-android-sdk\sdk\native\libs下的文件夾全部復(fù)制到j(luò)niLibs下面。
最后,在CMakeList的target_link_libraries中添加一條lib_opencv:
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib}
lib_opencv)
【3.gradle配置】
在項(xiàng)目根目錄下新建文件夾“distribution”,將OpenCV-android-sdk\sdk\native\jni下的include文件夾拷貝過(guò)去,再將OpenCV-android-sdk\sdk\native下的libs文件夾拷貝過(guò)去。(這個(gè)方法參考了某個(gè)博客,恕我記性不好沒(méi)法貼出來(lái)源……如果不拷貝直接使用OpenCV-android-sdk下的路徑應(yīng)該也是可以的)
在Gradle Scripts下應(yīng)該有兩個(gè)build.gradle,其中一個(gè)是Project的,我們不用管,打開(kāi)Module:app的gradle,在最外層添加一行def lib_distribution_root = '../distribution'
在android節(jié)點(diǎn)的defaultconfig下添加:
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
}
}
注意這和AS自動(dòng)生成的externalNativeBuild的位置是不一樣的,兩條都要有,再在android節(jié)點(diǎn)下添加:
sourceSets {
main {
jniLibs.srcDir(['${lib_distribution_root}/libs'])
}
}
如此,我們就可以在cpp文件夾中添加C++類(lèi),并使用opencv庫(kù)了,注意每添加一個(gè)cpp文件都要在CMakeList中add_library下添加一個(gè)源文件路徑(和通過(guò)mk文件編譯一樣)。
【4.OpenCV4Android和jni的聯(lián)動(dòng)】
我們依舊需要通過(guò)java層調(diào)用android api來(lái)獲取攝像頭數(shù)據(jù),比較簡(jiǎn)便的方法是file->new->import module,選中OpenCV-android-sdk\sdk\java,把java版的opencv作為模塊添加進(jìn)來(lái),然后在我們的app上右鍵->open module settings->dependencies->'+'->add module dependency,把opencv模塊添加依賴(lài),然后可以參考OpenCV-android-sdk\samples\tutorial-1-camerapreview來(lái)獲取攝像頭數(shù)據(jù),java版的mat對(duì)象有一個(gè)GetNativeObjAddr()成員函數(shù),獲取一個(gè)long類(lèi)型的mat地址,作為參數(shù)傳遞給native層,即可利用這個(gè)地址改變java層的mat對(duì)象,進(jìn)行一系列圖像處理。
以上這篇Android Studio中使用jni進(jìn)行opencv開(kāi)發(fā)的環(huán)境配置方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android應(yīng)用自動(dòng)更新功能實(shí)現(xiàn)的方法
這篇文章主要為大家詳細(xì)介紹了Android應(yīng)用自動(dòng)更新功能實(shí)現(xiàn)的方法,感興趣的小伙伴們可以參考一下2016-06-06
一文帶你徹底搞懂Behavior實(shí)現(xiàn)復(fù)雜的視覺(jué)聯(lián)動(dòng)效果原理
這篇文章主要為大家介紹了一文帶你徹底搞懂Behavior實(shí)現(xiàn)復(fù)雜的視覺(jué)聯(lián)動(dòng)效果原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Android RecyclerView點(diǎn)擊事件
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView點(diǎn)擊事件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
全面解析Android的開(kāi)源圖片框架Universal-Image-Loader
這篇文章主要介紹了Android的開(kāi)源圖片框架Universal-Image-Loader,Universal-Image-Loader在GitHub上開(kāi)源,其提供的圖片加載功能令人印象相當(dāng)深刻,需要的朋友可以參考下2016-04-04
Android自定義View實(shí)現(xiàn)支付寶支付成功-極速get花式Path炫酷動(dòng)畫(huà)
這篇文章主要介紹了Android自定義View實(shí)現(xiàn)支付寶支付成功-極速get花式Path炫酷動(dòng)畫(huà)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
Android實(shí)現(xiàn)輪詢(xún)的三種方式
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)輪詢(xún)的三種方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
Android textview 實(shí)現(xiàn)長(zhǎng)按自由選擇復(fù)制功能的方法
下面小編就為大家?guī)?lái)一篇Android textview 實(shí)現(xiàn)長(zhǎng)按自由選擇復(fù)制功能的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Android之Viewpager+Fragment實(shí)現(xiàn)懶加載示例
本篇文章主要介紹了Android之Viewpager+Fragment實(shí)現(xiàn)懶加載示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Android開(kāi)發(fā)歡迎頁(yè)點(diǎn)擊跳過(guò)倒計(jì)時(shí)進(jìn)入主頁(yè)
沒(méi)點(diǎn)擊跳過(guò)自然進(jìn)入主頁(yè),點(diǎn)擊跳過(guò)之后立即進(jìn)入主頁(yè),這個(gè)功能怎么實(shí)現(xiàn)呢,本文通過(guò)實(shí)例代碼給大家介紹Android開(kāi)發(fā)歡迎頁(yè)點(diǎn)擊跳過(guò)倒計(jì)時(shí)進(jìn)入主頁(yè),感興趣的朋友一起看看吧2023-12-12

