搞了三天,終於搞出來了,耐心解決問題,都會解決的,堅信一切困難都可以克服!!(捂臉笑)
這個版本的opencv庫是針對安卓版本進行編譯的,可以同時生成動態庫和靜態庫,後續文章也會介紹如何使用編譯好的庫。
source: opencv-4.1.1-openvino
contrib: opencv_contrib-4.1.1
SDK: android-sdk
ndk:android-ndk-r16-beta1-windows-x86.zip
ndk解壓之後就可以了
官網鏈接:https://www.androiddevtools.cn/
備註:我剛開始在android studio 上sdk manager管理器中的sdk tools下安裝的ndk,
最新版本是ndk-r20,但是在編譯過程中總是提示ndk是invalid,後在官網下載了r16版本ok
cmake: https://cmake.org/download/
需要配置環境變量E:\Program Files\CMake\bin
MinGW: https://sourceforge.net/projects/mingw/files/
同樣要配置好環境變量E:\MinGW\bin。cmd輸入gcc -v檢查是否安裝配置成功。
MinGW是windows平臺下編譯必須的插件
Ant: The apache ant project http://ant.apache.org/
選擇Download-Binary Distributions 我選擇了apache-ant-1.10.1-bin.zip版本
環境變量: ANT_HOME E:\apache-ant-1.10.1
CLASSPATH E:\apache-ant-1.10.1\lib
PATH E:\apache-ant-1.10.1\bin
準備工作完成
開始編譯
step1. 打開cmake gui 配置目錄
add entry增加變量:
NAME=ANDROID_ABI TYPE=STRING VALUE=armeabi
NAME=ANDROID_NDK TYPE=PATH VALUE=F:/android/android-ndk-r16-beta1-windows-x86
配置完點擊configure
第一次會提示選擇編譯器,選擇MinGW,交叉編譯,下一步選擇文件路徑:
opencv的sources/platforms/android/android.toolchain.cmake
點擊finish。
等待幾分鐘,出現下面圖示表示ok
查看java包是否打包進去:
java wrappers yes, 當爲no時,需要把world項去掉,把java項都勾上
點擊configure
step2. 編譯opencv-contrib
搜索OPENCV_EXTRA_MODULES_PATH把我們的opencv_contrib/modules的路徑添加進去
點擊generate完成
step3. 編譯
打開cmd,進去一開始選擇的輸出編譯目錄
輸入mingw32-make,等待編譯,出現下圖則表示編譯ok
在這一步容易出現問題,可以參考以下文章進行修改,避免花費更過時間:
https://github.com/opencv/opencv/issues/8460
https://answers.opencv.org/question/179297/how-to-build-opencv-for-android-using-visual-studio/
下面是我自己出錯後的解決辦法:
在這一步出現了問題,提示opencv\modules\core\src\utils\logtagconfigparser.cpp:301:16:error: 'to_string' is not a member of 'std' 編譯失敗
說明當前cmake不支持c++11
嘗試一:在android.toolchain.cmake文件中修改使得cmake支持c++11
在文件結尾加入:
SET(CMAKE_C_COMPILER g++)
add_compile_options(-std=c++11)
失敗
嘗試二:在cmake_minimum_required( VERSION 2.6.3 )下增加SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
失敗
嘗試三:自己寫一個 std::to_string() 替換標準庫中的
首先寫一個 stdtostring.h 文件:
- #ifndef STDTOSTRING_H
- #define STDTOSTRING_H
- #include <string>
- #include <sstream>
- using namespace std;
- namespace std
- {
- template < typename T > std::string to_string( const T& n )
- {
- std::ostringstream stm ;
- stm << n ;
- return stm.str() ;
- }
- }
- #endif
然後在需要使用 std::to_stirng() 方法的源文件中包含它:
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID #include "stdtostring.h" #endif
我是直接在opencv\modules\core\src\utils\logtagconfigparser.cpp文件頂部加入include "stdtostring.h" to_string問題解決
也可以嘗試增加變量ENABLE_CXX11 BOOL 勾選
到了95%又掛了。。。
modules\video\src\dis_flow.cpp:442:106: error: 'log2' was not declared in this scope
return std::max(0, (int)std::floor(log2((2.0f*(float)img_width) / ((float)fratio * (float)patch_size))));
據資料顯示,android不支持log2(x),所以log2(x)=log(x)/log(2)
好吧,97%又掛了。。。
The "android" conmmand is deprecated.
...
Invalid or unsupported command "--silent creat lib-project --path "E:\build-opencv-for-android-4.1.1\armeabi-v7a\android_sdk" --target "ANDROID_SDK_COMPATIBLE_TARGET-NOTFOUND" --name OpenCV --package org.opencv"
Supported commands are:
android list target
android list avd
android list device
android move avd
androi list sdk
android update sdk
modules\java\android_sdk\CMakeFiles\opencv_java_android.dir\build.make:83: recipe for target 'android_sdk/build.xml' failed
新版的SDK tools中的android命令已經不支持 android create project等命令
在Android Studio官網的sdkmanager頁面中,明確提到了在Android SDK Tools25.2.3及以後提供了sdkmanager command-line tools 以及捨棄android命令.
爲了繼續編譯opencv-Android,我們使用版本低於25.2.3的android SDK Tools
我這裏使用了android-sdk_r24.2-windows.zip下載完成後解壓,複製其中的tools目錄,將原來的tools目錄改名爲tools1,拷貝到其位置。
同時下載platform-tools-r22-windows,解壓並複製其中的platform-tools目錄,將原來的platform-tools改名爲platform-tools1,拷貝到其位置
error仍然存在:
modules\java\android_sdk\CMakeFiles\opencv_java_android.dir\build.make:83: recipe for target 'android_sdk/build.xml' failed
但是“The "android" conmmand is deprecated. ...”不提示了
刪除build文件夾內所有內容(修改tools文件夾後必須這麼操作),重新來一遍:依舊錯誤
取消BUILD_TESTS, BUILD_PERF_TESTS選項,重新configure:成功了!!!
step4. 打包, 輸入mingw32-make install
完成之後,可以在這個目錄下的install文件夾下拿到編譯好的東西
以上是“armeabi”平臺的庫文件
按照以上步驟可以編譯出“armeabi-v7a”版本的庫文件
所有工作完成後,合併install/sdk/native/目錄即可。
在官方opencv-android-sdk.zip下分別編譯了四個平臺的庫文件:
後續如果需要哪個平臺的庫文件,再按照上述步驟編譯就是了!