搞了三天,终于搞出来了,耐心解决问题,都会解决的,坚信一切困难都可以克服!!(捂脸笑)
这个版本的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下分别编译了四个平台的库文件:
后续如果需要哪个平台的库文件,再按照上述步骤编译就是了!