相信初學(xué)者(正是在下沒錯(cuò)了)在學(xué)習(xí)OpenCV時(shí),時(shí)常會(huì)一頓操作猛如虎订框,一跑起來析苫。。。衩侥。国旷。嗯?還要我安裝附加的Manager App茫死?也就是這句話-----
Opencv manager package was not found
想了想自己研究的時(shí)候裝個(gè)Manager也到無所謂跪但,可是當(dāng)需要發(fā)布應(yīng)用時(shí),總不能讓人家也去安裝吧峦萎,于是一頓尋找之下屡久,發(fā)現(xiàn)網(wǎng)上大多都是照著Demo直接寫
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, loaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
loaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
經(jīng)實(shí)測直接這樣寫根本不行,于是我去看initDebug中的邏輯爱榔,發(fā)現(xiàn)需要加載靜態(tài)so文件才能完成這種情況下的初始化被环。我順其自然的就去看官方的demo,發(fā)現(xiàn)用的是老的構(gòu)建方法搓蚪,也就是通過編輯Android.mk Application.mk 來實(shí)現(xiàn)。出于與時(shí)俱進(jìn)的想法丁鹉,我決定用CMakeList的方式來實(shí)現(xiàn)so文件的加載妒潭。(至于把OpenCV引入項(xiàng)目的方法以及具體的邏輯實(shí)現(xiàn)就不說了,網(wǎng)上有很多揣钦,不懂的大家自己做功課吧)
1. 拷貝so文件到libs目錄
首先是將sdk/native/libs下對(duì)應(yīng)架構(gòu)的so文件復(fù)制到項(xiàng)目的libs文件夾下(準(zhǔn)確的來說是需要移到JniLibs目錄下的雳灾,不然會(huì)遇到讀不到的情況,當(dāng)然也可以通過將libs指定為JniLib的方式的實(shí)現(xiàn)冯凹,這個(gè)問題也是老生常談了谎亩,具體代碼就不貼了,網(wǎng)上很多相關(guān)代碼)宇姚。
2. 修改CmakeList文件
接著是修改CmakeList文件匈庭,這個(gè)文件在初始化NDK項(xiàng)目時(shí)會(huì)自動(dòng)生成,我們只需要在原有基礎(chǔ)上修改即可浑劳,具體使用方法可參考官方文檔阱持。
我們首先添加
add_library(
opencv_java3
SHARED
IMPORTED
)
set_target_properties(
opencv_java3
PROPERTIES IMPORTED_LOCATION
${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libopencv_java3.so
)
這里大家應(yīng)該能猜到大概意思,就是添加一個(gè)新的庫魔熏,并制定目標(biāo)的所在位置衷咽,這里的${ANDROID_ABI}指的是相應(yīng)的架構(gòu),具體支持哪些架構(gòu)要看復(fù)制了哪些架構(gòu)的so文件蒜绽,同時(shí)記得要在build.gradle里配置abiFilters哦镶骗,這里也就不展開了。
PS:我這里使用的是Module目錄下的libs文件夾躲雅,大家在使用時(shí)需根據(jù)實(shí)際情況進(jìn)行修改鼎姊。
接著在target_link_libraries中加入剛剛添加的庫,不然編譯打包時(shí)會(huì)打不進(jìn)去庫
target_link_libraries( # Specifies the target library.
native-lib
opencv_java3
# Links the target library to the log library
# included in the NDK.
${log-lib}
)
3. 檢查apk包中是否已經(jīng)將相關(guān)庫打包
最后我們編譯運(yùn)行項(xiàng)目(具體使用邏輯可以先不加,主要看是否初始化成功了)在app模塊的/build/outputs/apk/debug下雙擊app-debug.apk文件此蜈,如果看到相關(guān)庫已經(jīng)打進(jìn)去了即横,那么就證明成功了,也就不會(huì)出現(xiàn)一開始那個(gè)Manager的彈窗了裆赵。
本人也是第一次寫這樣的文章东囚,實(shí)屬是個(gè)萌新,有不正確的地方也請(qǐng)各位大佬指出U绞凇R吃濉!總之還是希望能給到大家一些幫助植兰,因?yàn)檫@方面的資料和案例很少份帐,所以自己在研究的時(shí)候也感覺到有些痛苦,所以這次特地記錄下來分享給大家楣导。