Windows環境下爲Android編譯OpenCV4.3
踩了三四天的坑,今天終於順利跑通了,原來是toolchain的問題,外網的教程大多都是用opencv source裏的toolchain,會致使各類奇奇怪怪的錯誤(std not a member of std,canot find iostram等等)html
環境配置
本文編譯環境以下:java
- 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 源碼,解壓放到你記得住的文件夾android
-
下載 cmake 3.18 圖方便直接選安裝包就行
cmake-3.18.0-rc1-win64-x64.msi
ios -
下載 Mingw(建議用installer傻瓜式安裝)選擇下列須要安裝的組件,右鍵選擇
Mark for Installation
,以後選擇Menu -> Installation -> Apply Changes
安裝完後把mingw加入系統環境變量(win鍵搜索環境變量就有,編輯完後重啓系統生效)
c++ -
下載 Android NDK 和 SDK,能夠直接在官網下,但這裏推薦直接在 Android Studio 裏安排。打開AS任意一個項目,在工具欄選擇
Tools -> SDK Maneger
。
打開後選擇SDK Tools,勾選右下角 Show Package Details,勾選一個NDK版本,Apply。
SDK同理,安裝完後打開Project Structure -> SKD Location
找到SDK路徑。
一樣要寫到環境變量裏
git
NDK則在Sdk\ndk\21.2.6472646
,不寫進環境變量也沒問題,待會要在cmake裏配置
github -
安裝 JDK,最低須要 8,這裏用 8u251 (太高版本可能不兼容)
一樣須要配置環境變量
還需加入
對着打就行,重啓後能夠用cmd測試是否配置成功
apache -
下載 ANT 1.10.7,放到你記得住的目錄bash
編譯配置
新建一個存放編譯結果的文件夾,好比我就放在 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裏鏈接,以後可能會寫。
錯誤處理總結我以後在寫,能夠把報錯貼到評論區或者私聊問我。