1. 程式人生 > 實用技巧 >關於Android Studio中使用jni進行opencv配置開發環境的要素祕訣

關於Android Studio中使用jni進行opencv配置開發環境的要素祕訣

使用jni進行opencv開發可以快速地將PC端的opencv程式碼移植到手機上,但是如何在android studio下進行配置,網上幾乎找不到教程,大多都是eclipse下使用mk檔案的方法,找不到使用gradle的方案,摸了幾天,總算是摸清楚了。

其實找對了方法,用android studio配置環境要比eclipse簡單很多,首先是預先準備的環境:

1.Android studio,官網最新版,我用的是2.3.1;

2.OpenCV4Android,官網最新版,我用的3.2.0;

就這兩個就行了,不需要像eclipse一樣手動配置jni啊adt啊一堆有的沒的。

配置步驟如下:

【1.新建專案】

選中”Include C++ support”,後面無腦next,Android會幫你把jni環境直接配置好。等gradle build完畢,可以在project視窗的Android標籤頁下看到有External Build Files,下面是一個CMakeList.txt檔案,這個是Android Studio自動生成的一個makefile,相當於用cmake編譯jni的部分,如果你cmake用得很熟練,那麼只要在這個檔案裡配置好opencv的路徑,再在gradle里加點引數就可以輕鬆搞定,具體過程如下:

【2.編輯CMakeList.txt】

在CMakeList.txt中增加如下條目:

專案路徑和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依賴

include_directories(${pathToOpenCv}/sdk/native/jni/include)

動態方式載入

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)
可以看到配置裡有一個{pathToProject}/app/src/main/jniLibs/{ANDROID_ABI}/libopencv_java3.so檔案,我們暫時還沒有,需要我們手動建立相應的jniLibs目錄,這個目錄會被Android Studio自動識別作為編譯jni程式碼時的庫目錄。

建立好如圖的目錄以後,將OpenCV-android-sdk\sdk\native\libs下的資料夾全部複製到jniLibs下面。

最後,在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配置】

在專案根目錄下新建資料夾“distribution”,將OpenCV-android-sdk\sdk\native\jni下的include資料夾拷貝過去,再將OpenCV-android-sdk\sdk\native下的libs資料夾拷貝過去。(這個方法參考了某個部落格,恕我記性不好沒法貼出來源……如果不拷貝直接使用OpenCV-android-sdk下的路徑應該也是可以的)

在Gradle Scripts下應該有兩個build.gradle,其中一個是Project的,我們不用管,開啟Module:app的gradle,在最外層新增一行def lib_distribution_root = ‘../distribution’

在android節點的defaultconfig下新增:

externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
}
}
注意這和AS自動生成的externalNativeBuild的位置是不一樣的,兩條都要有,再在android節點下新增:

sourceSets {
main {
jniLibs.srcDir(['${lib_distribution_root}/libs'])
}
}
如此,我們就可以在cpp資料夾中新增C++類,並使用opencv庫了,注意每新增一個cpp檔案都要在CMakeList中add_library下新增一個原始檔路徑(和通過mk檔案編譯一樣)。

【4.OpenCV4Android和jni的聯動】

我們依舊需要通過java層呼叫android api來獲取攝像頭資料,比較簡便的方法是file- new- import module,選中OpenCV-android-sdk\sdk\java,把java版的opencv作為模組新增進來,然後在我們的app上右鍵- open module settings- dependencies- ‘+’- add module dependency,把opencv模組新增依賴,然後可以參考OpenCV-android-sdk\samples\tutorial-1-camerapreview來獲取攝像頭資料,java版的mat物件有一個GetNativeObjAddr()成員函式,獲取一個long型別的mat地址,作為引數傳遞給native層,即可利用這個地址改變java層的mat物件,進行一系列影象處理。

以上這篇Android Studio中使用jni進行opencv開發的環境配置方法就是小編分享給大家的全部內容了,希望能給大家一個參考。