文章目录
这一篇笔记是编译.a静态库,如果是编译dll可以看上一篇笔记:https://blog.csdn.net/Vissence/article/details/127000366
1. 准备工作
需要准备的项:
- 源码:OpenCV + Contrib
- 编译工具:CMake + MinGW
- 提供NDK和SDK:Android Studio
- 可选项:Java JDK(如果只是生成静态库,不需要安装这个)
1.1 下载OpenCV+Contrib
下载地址:https://github.com/opencv
- OpenCV下载
下载最新的Release即可。
分别下载OpenCV和Contrib的Source code.zip,并解压文件
1.2下载CMake
下载地址:https://cmake.org/
这是一个图形化界面的CMake工具,开箱即用,极大的简化了OpenCV的编译。
一路Next,再从Start里打开CMake,显示如下。
1.3 下载MinGW
下载地址:https://sourceforge.net/projects/mingw-w64/files/
解压之后,配置下环境变量即可。
如果不知道怎么做,可以参考:https://blog.csdn.net/yvge669/article/details/124564622
1.3 下载Android Studio,并配置SDK和NDK
下载地址:https://developer.android.com/studio
下载完成之后,打开Android Studio,点击右上角按钮,选择SDK Manager中进行配置,不需要创建项目。
按照下面的步骤,下载SDK和NDK。
- 0:默认的SDK路径,待会儿需要填写,不用修改
- 1:显示Package Details,如果不知道用哪个版本的SDK和NDK,直接下载最新的即可
- 2:勾上想要的SDK,NDK版本
- 3:点击Apply
2. 编译OpenCV + Contrib源码
2.1 CMake配置项目文件
1:OpenCV源码目录
2:生成的项目文件放在哪里
3:添加Android的配置参数
需要注意的是,Android_ABI参数必须在一开始就填写。
如果在点击Configure之后才添加,Android_ABI会默认为armabi-v7a平台,后面再修改为arm64-v8a也没用了。(亲身经历,大家可以自己试试)
另外,如果路径是复制粘贴的,注意使用右反斜杠,左反斜杠会识别为转义字符#编译后的 opencv 应用在 android 系统cpu 所对应的架构 #armeabiv-v7a:第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它. #arm64-v8a:第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。 #armeabi:第5代、第6代的ARM处理器,早期的手机用的比较多。 #x86:平板、模拟器用得比较多。 #x86_64:64位的平板 # string类型 ANDROID_ABI:arm64-v8a # path类型 #当前windows 安装android studio sdk 路径 ANDROID_SDK:D:/Sdk # path类型 #当前windows 安装android studio ndk ANDROID_NDK:D:/Sdk/ndk/21.1.6352462 # string类型 #默认API为21 ANDROID_NATIVE_API_LEVEL 21 # string类型 #根据需求写入c++_static或c++_shared(默认是gnustl_static) ANDROID_STL:c++_static 参考:https://blog.csdn.net/Chhjnavy/article/details/125560125
4:点击Configure,选择刚刚在Android Studio中下载的NDK中的build/cmake/android.toolchain.cmake
5:搜索extra,填写Contrib的路径
注意:如果前面下载了多个版本的SDK,记得修改一下编译的SDK版本,否则默认是最新的。
6:搜索build,取消勾选Examples和Projects
因为我们只需要静态库文件,不需要build示例,所以可以取消。
取消之后Java Wrappers会变为NO
如果不取消,需要安装Java JDK,并配置对应的gradle版本;
Java JDK:https://www.oracle.com/java/technologies/downloads/
Java和gradle版本对应:https://docs.gradle.org/current/userguide/compatibility.html
gradle和gradle plugin版本对应:https://developer.android.google.cn/studio/releases/gradle-plugin.html#updating-plugin
7:点击Configure,取消不需要的库
红色是指新更新的参数,白色是没有更新的参数,点两次Configure,就都会变白
8:Build_Type改为Release,除非需要Debug OpenCV源码。
9:点击Configure让所有内容都变白,就可以点击Generate生成项目文件了
2.2 MinGW编译OpenCV
进入项目生成的目录,打开PowerShell或者Git bash,运行mingw32-make.exe -j8开始编译
mingw32-make.exe -j8
# -j8的意思是,用多少个核心进行编译,如果不加默认是单线程,编译很慢,具体数字根据自己核心来
build完成之后,再执行mingw32-make.exe install生成库
mingw32-make.exe install
打开install/sdk/native文件夹,我们需要的文件都在这一个文件夹里
3. 如果勾选OpenCV Examples和OpenCV Projects
3.1 安装JAVA JDK,配置Gradle
- 根据项目需要的版本安装Java JDK,并配置对应的gradle版本;
Java JDK:https://www.oracle.com/java/technologies/downloads/
Java和gradle版本对应:https://docs.gradle.org/current/userguide/compatibility.html
gradle和gradle plugin版本对应:https://developer.android.google.cn/studio/releases/gradle-plugin.html#updating-plugin
安装完JAVA JDK,记得在环境变量中配置JAVA_HOME的位置
- 勾选EXAMPLES和PROJECTS,点击Configure之后,Java Wrappers为YES
3.2 添加local.properties文件
在opencv_android文件夹下添加local.properties文件,文件内容为:sdk和ndk的路径,也就是前面Android Studio下载的sdk和ndk路径
参考:https://blog.csdn.net/Chhjnavy/article/details/125560125
3.3 编译OpenCV
和第二部分一样,用MinGW编译即可,这里记录几个编译的报错信息。
- Could not determin java version from “17.0.4.1”
这个是因为JDK、Gradle、Gradle Plugin的版本不兼容的问题;
请参考前面的版本对应表,重新下载JDK并配置Gradle Plugin和Gradle版本
- Android build fails with JDK 15 and NDK 22: Source option 6 is no longer supported. Use 7 or later
把opencv_android\opencv\build.gradle中的三行代码删掉即可。
具体原因,看了下Github和Android官网的解释,没看明白。但是删除之后确实编译成功了
参考:https://github.com/opencv/opencv/issues/19567
参考:https://developer.android.com/studio/write/java8-support
4. 总结
Android的坑也太多了吧,能编译成功完全靠运气。