Windows環境下為Android編譯OpenCV4.3
踩了三四天的坑,今天終於順利跑通了,原來是toolchain的問題,外網的教程大多都是用opencv source里的toolchain,會導致各種奇奇怪怪的錯誤(std not a member of std,canot find iostram等等)
環境配置
本文編譯環境如下:
- cmake 3.18
- Android Studio 4.0
- Mingw
- Java JDK 8 (需要8+,過高版本可能不兼容)
- Apache ant1.10.7 (只編譯.so庫則不需要)
-
首先需要下載OpenCV 4.3.0 源碼,根據需求再加上OpenCV_contrib 4.3.0 源碼,解壓放到你記得住的文件夾
-
下載 cmake 3.18 圖方便直接選安裝包就行
cmake-3.18.0-rc1-win64-x64.msi

-
下載 Mingw(建議用installer傻瓜式安裝)選擇下列需要安裝的組件,右鍵選擇
Mark for Installation,之后選擇Menu -> Installation -> Apply Changes

安裝完后把mingw加入系統環境變量(win鍵搜索環境變量就有,編輯完后重啟系統生效)

-
下載 Android NDK 和 SDK,可以直接在官網下,但這里推薦直接在 Android Studio 里安排。打開AS任意一個項目,在工具欄選擇
Tools -> SDK Maneger。

打開后選擇SDK Tools,勾選右下角 Show Package Details,勾選一個NDK版本,Apply。

SDK同理,安裝完后打開Project Structure -> SKD Location找到SDK路徑。


同樣要寫到環境變量里
NDK則在Sdk\ndk\21.2.6472646,不寫進環境變量也沒問題,待會要在cmake里配置 -
安裝 JDK,最低需要 8,這里用 8u251 (過高版本可能不兼容)

同樣需要配置環境變量

還需加入

對着打就行,重啟后可以用cmd測試是否配置成功

-
下載 ANT 1.10.7,放到你記得住的目錄
編譯配置
新建一個存放編譯結果的文件夾,比如我就放在 G:\opencv\android_build,解壓后源碼放在 G:\opencv\source
運行 cmake-gui (找不到就按win搜索)

將源碼和輸出地址填入這里

點擊 Add Entry,添加以下幾個屬性
ANDROID_NDK類型為PATH,填入你的NDK路徑(AS下載的就在Sdk\ndk\21.2.6472646)ANDROID_SDKPATH,填入你的SDK路徑ANDROID_ABISTRING,設置平台,不填默認為armeabi-v7aANDROID_NATIVE_API_LEVELSTRING,默認API為21ANT_EXECUTABLEPATH,填入ANT路徑下的bin(用於java 封裝,便於 AS 導入module)ANDROID_STLSTRING,根據需求寫入c++_static或c++_shared(默認是gnustl_static)
這時候你可以看到一片紅,不用慌,這是代表新增,不是報錯。我們點擊下方的Configure。

選擇這個選項,Next。

這里需要配置toolchain路徑,注意了,不要用源碼包里的toolchain,用你自己的ndk目錄下的toolchain,不然可能導致一系列頭文件丟失的錯誤,血的教訓=_=。
等待Configure完成,一切正常的話應該是這樣

如果你需要的話,現在可以添加opencv-contrib模塊,搜索 extra,在 OPENCV_EXTRA_MODULES_PATH 添加路徑 ....../opencv_contrib-4.3.0/modules。(需要重新添加NDK路徑)
參數調整
以下參數根據自己需求調整
-
BUILD_ANDROID_PROJECTS不需要示例項目可直接取消勾選 -
BUILD_ANDROID_EXAMPLES= OFF -
BUILD_PERF_TESTS= OFF -
BUILD_TESTS= OFF -
BUILD_opencv_world= OFF (生成 .so 庫 libopencv_world.so,這是一個集合,不清楚和默認編譯的 libopencv_java3.so 有什么區別,默認不開啟,如果開啟的話不會復制 java 層函數,也就是 cmake 的 gui 界面會顯示 Java wrappers: NO) -
BUILD_SHARED_LIBS= OFF (如果 On 則只編譯 so 庫) -
WITH_CUDA= OFF (CUDA 是 NVidia 推出的並行計算架構,編譯非安卓 SDK 時建議添加) -
WITH_OPENCL= ON (因為我們編譯的是 android sdk,所以建議添加移動端的並行架構支持) -
WITH_OPENCL_SVM= ON (建議開啟共享虛擬內存)
調整完后再次點擊Configure,完成后點擊Generate。
執行編譯
完成后通過命令行工具 cmd (管理員身份) 進入 你的build文件夾,或者直接在 buid 文件夾右鍵選擇 Gitbash

輸入命令 mingw32-make.exe
如果沒有出現報錯,則再輸入 mingw32-make.exe install

編譯完成,打開AS的項目,在工具欄選擇File -> New -> Import_Module,把 build/install/sdk/java 導入即可(如果你有配置ANT的話)或者直接copy編譯出來的.a或者.so在AS里連接,之后可能會寫。
錯誤處理總結我之后在寫,可以把報錯貼到評論區或者私聊問我。
