踩了三四天的坑,今天終於順利跑通了,原來是toolchain的問題,外網的教程大多都是用opencv source里的toolchain,會導致各種奇奇怪怪的錯誤(std not a member of std,canot find iostram等等) ...
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_SDK
PATH,填入你的SDK路徑ANDROID_ABI
STRING,設置平臺,不填預設為armeabi-v7a
ANDROID_NATIVE_API_LEVEL
STRING,預設API為21ANT_EXECUTABLE
PATH,填入ANT路徑下的bin(用於java 封裝,便於 AS 導入module)ANDROID_STL
STRING,根據需求寫入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里連接,之後可能會寫。
錯誤處理總結我之後在寫,可以把報錯貼到評論區或者私聊問我。