20220924 Windows平台用MinGW编译OpenCV+Contrib静态库(.a)

发布于:2022-12-08 ⋅ 阅读:(897) ⋅ 点赞:(0)

这一篇笔记是编译.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

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的坑也太多了吧,能编译成功完全靠运气。


网站公告

今日签到

点亮在社区的每一天
去签到