win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib

  • 前言
  • 一、编译环境
  • 二、cmake编译
    • 1.生成Makefile
    • 2.使用mingw编译
  • 三、编译问题
    • 问题1:undefined reference to `__imp_GetACP‘
    • 问题2:error: '::hypot' has not been declared

前言

本文是系列文章2,最终目标是使用jni封装so,在Android上直接调用OpenCV的微信二维码解码接口。
本机已有环境如下:
1,jdk-8u321-windows-x64.exe
2,android-sdk_r24.4.1-windows.zip
3,apache-ant-1.10.12-bin.zip
4,android-ndk-r18b-windows-x86_64.zip
本文需要的环境如下:
1,cmake-3.19.2-win64-x64
2,mingw-64\x86_64-8.1.0
3,opencv-4.5.2.zip
4,opencv_contrib-4.5.2.zip


一、编译环境

(1)编译环境需求
编译OpenCV4Android所需要的环境有:JDK、SDK、NDK、Ant,配置方式如系列文章1所示,其他必须的环境有cmake和mingw,这俩软件之前在本机已经配置过,所以不再描述配置过程,因为忘记了。。。
本机cmake版本:cmake-3.19.2-win64-x64,mingw环境如下:

(2)opencv源码
下载地址:opencv-4.5.2.zip和opencv_contrib-4.5.2.zip;下载后解压到相应的目录。
需要注意的是,我们下载的是源码Source code,而不是opencv-4.5.2-android-sdk.zip,因为官方编译的sdk不包含opencv_contrib的内容,我们要使用的就是opencv_contrib中的wechat_qrcode模块,而且还修改了源码,所以才有此编译。


二、cmake编译

1.生成Makefile

(1)双击打开cmake-gui.exe

(2)配置源码目录和编译目录
D:/Android/opencv-4.5.2是opencv源码所在目录,D:/Android/opencv_android是新建目录,用来保存所有编译结果。

(3)添加参数
点击Add Entry,添加如下变量:

ANDROID_ABI:armeabi-v7a
ANDROID_SDK:D:/Android/android-sdk-windows
ANDROID_NDK:D:/android-ndk-r18b
ANT_EXECUTABLE:D:/Android/apache-ant-1.10.12/bin
ANDROID_STL:c++_static

ANDROID_ABI:设置平台,根据需要armeabi-v7a或者armeabi等,当需要多个平台时,需要重新设置新的编译目录,编译完成后把结果合并在一起即可,可以参考官方SDK目录。
ANDROID_STL:默认的stl编译方式是gnustl_static,这个在高版本软件已经不适配,本文使用c++_static,还有一种c++_shared,根据需求设置。
(4)设置mingw编译
添加以上Entry后,点击Configure,选择MinGW Makefiles和toolchain交叉编译

在接下来出现的Specify the Toolchain file里选择NDK目录下的toolschain,而不是源码中的,据其他博主说,如果选择opencv源码中的toolschain,会出各种编译错误。。。

点击finish,出现以下结果,Java wrappers:必须是YES才可以,如果不是,可能勾选了BUILD_opencv_world,取消即可。

(5)参数调整
OPENCV_EXTRA_MODULES_PATH=D:/Android/opencv-4.5.2/opencv_contrib-4.5.2/modules
添加opencv_contrib,很重要,使用微信解码
BUILD_ANDROID_PROJECTS=ON
BUILD_ANDROID_EXAMPLES=ON
BUILD_PERF_TESTS=OFF
BUILD_TESTS=OFF
这些测试模块,默认是ON,没有编译通过,猜想应该是本人在opencv中添加了自定义接口导致,改成OFF后通过
BUILD_opencv_world=OFF,这个opencv_word在早期的opencv中是没有的,特别是在windows上编译后会出现各个模块的dll,有了这个,最后只生成一个opencv_world.dll,很方便,在Android上,本人不知道跟java4.so有什么分别,默认OFF就OFF吧。
BUILD_SHARED_LIBS=OFF,默认值,编出来跟官方一致,不要修改成ON,否则会编出很多so,根据需要吧
WITH_OPENCL=ON (因为我们编译的是 android sdk,所以建议添加移动端的并行架构支持)
WITH_OPENCL_SVM=ON (建议开启共享虚拟内存)
调整完后再次Configure,完成后点击Generate

参数调整参考了博文https://www.cnblogs.com/zhxmdefj/p/13094954.html,表示感谢。

2.使用mingw编译

(1)使用管理员权限打开cmd(官方不建议使用cygwin)
cd到编译输出目录,在这里是D:/Android/opencv_android,然后执行mingw32-make

如果如上图没有报错,再输入mingw32-make install


install成功后,SDK被安装在D:\Android\opencv_android\install目录下,可以对比下官方目录基本一致,多了opencv_contrib模块的内容。


三、编译问题

问题1:undefined reference to `__imp_GetACP‘

好像只有opencv_contrib 4.5.2这个版本才会遇到这个问题,解决办法:
1,找到opencv_contrib\modules\wechat_qrcode\src\zxing\zxing.hpp,将第30行的

#if defined(__ANDROID_API__)

改为

#if defined(__ANDROID_API__) || defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)

2,注释第54到第62行的内容:

#if defined(_MSC_VER)#ifndef NO_ICONV
#define NO_ICONV
#endif#endif

3,保存后,在cmake中重新configure和generate,再继续之后的步骤即可
解决办法来源:https://blog.csdn.net/coolermzb3/article/details/116278830

问题2:error: ‘::hypot’ has not been declared

1,找到文件C:\Program Files\mingw-64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\cmath然后添加

#define _hypot hypot

2,保存后重新编译

解决办法来源:https://blog.csdn.net/weixin_37993251/article/details/88054384
感谢以上两位博主!

win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib相关推荐

  1. win10编译OpenCV4Android系列1-Android编译环境搭建

    win10编译OpenCV4Android系列1-Android编译环境搭建 前言 一.配置JDK 1.下载JDK 2.安装JDK 二.配置AndroidSDKTools 1.下载AndroidSDK ...

  2. 运行时常量池在哪里_C++干货系列——从编译期常量谈到constexpr(一)

    C++20都支持虚函数的constexpr了,我打算用三篇读文章讲清楚编译期常量和constexpr这个东西和编译期常量的关系,即为什么需要他来辅助解决这个问题.最后帮助读者在实际编码过程中能够有意识 ...

  3. win10子系统编译android,基于win10子系统ijkplayer全量编译(支持所有格式)流程

    1 环境搭建 1.1 编译环境说明 ijkplayer目前支持linux,mac平台编译.windows平台暂不支持.如果没有linux环境,可以使用win10自带的子系统ubuntu进行编译.win ...

  4. Android APK系列4-------Android编译APK后的系统结构

    Android APK系列4-------Android编译APK后的系统结构 system文件夹就是system.img的解压结果,data就是userdata.img的解压结果,root就是ram ...

  5. Android编译优化系列-kapt篇

    一.背景 本文是编译优化系列文章之 kapt 优化篇,后续还会有 build cache, kotlin, dex 优化等文章,敬请期待.本文由Client Infra->Build Infra ...

  6. 【GCC编译优化系列】宏定义名称与函数同名是一种什么骚操作?

    作者简介 *架构师李肯(全网同名)**,一个专注于嵌入式IoT领域的架构师.有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于 ...

  7. 【GCC编译优化系列】究竟什么样的代码会导致函数调用的栈溢出呢?

    [GCC编译优化系列]究竟什么样的代码会导致函数调用的栈溢出呢? 一段看似铁定栈溢出的函数代码,它一定会溢出吗? 文章目录 1 问题现场 2 简单分析 3 深入分析 3.1 假如不考虑编译优化的情况 ...

  8. FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译

    FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, M ...

  9. 【GCC编译优化系列】GCC链接失败的错误提示 undefined reference to ‘xxx‘ 可能还有一种情况你没注意到?

    文章目录 1 写在前面 2 问题描述 2.1 问题现场 2.2 快速排查 2.3 判断问题 3 知识点突破 3.1 场景复现 3.2 深入分析 3.3 涨点新知识 4 经验总结 5 参考链接 6 更多 ...

  10. 跑yolo3模型出的效果图_【目标检测实战】Darknet入门—yolov3模型训练(Win10下的安装、编译、实现)...

    效果图 简介 Yolo,是实时物体检测的算法系统,基于Darknet-一个用C和CUDA编写的开源神经网络框架.它快速,易于安装,并支持CPU和GPU计算,也是yolo的底层.本文主要介绍在win10 ...

最新文章

  1. R语言使用lmPerm包应用于线性模型的置换方法(置换检验、permutation tests)、使用lm模型构建简单线性回归模型、使用lmp函数生成置换检验回归分析模型
  2. ionic2.0消息订阅监听机制
  3. svg 点击 事件_使用 SVG 实现圆环日期选择器
  4. jquery中动态效果
  5. 版本管理工具 (git 或者 svn)
  6. 大于2的质数判断以及范围质数查找
  7. STM32(三)-------流水灯(标准库函数)
  8. shl性格测试_德勤2021秋招网申Tips+SHL笔试原题
  9. python中文件最重要的功能是什么和接收数据_Python测试题
  10. CPU输入/输出的控制方式有哪些?
  11. C语言编程入门训练(一)
  12. 经验:如何快速地写出格雷码
  13. JAVA | MongoDB 去重、聚合函数、Criteria Query使用
  14. PS CC 2018 切片复制问题解决方法
  15. 同一个世界 两世之约(1-6)
  16. 神奇粪菌移植技术挽救垂危妙龄女
  17. 2022-ISCC信息安全与对抗竞赛wp-misc(详解,有脚本( •̀ ω •́ )y)
  18. 【SDK】The Agora RTM SDK及RTE 传输调用
  19. 如何学习3DMAX建模放样?
  20. 信息熵、gini、信息增益

热门文章

  1. 准谐振器和双二阶广义积分器的共同点和不同点
  2. android 激光打印机,#本站首晒# 安卓端无线打印的方案选择 兄弟 DCP1618W 一体机...
  3. Linux为sh脚本文件添加执行权限
  4. mysql数据库常用的增删改查sql语句
  5. RGB888和RGB565颜色对照表
  6. simulink的pid参数自整定
  7. ERP原理:第二节 物料清单(BOM)
  8. ERP原理 : 第五节 销售管理的工作原理
  9. 百度地图,坐标反查,拾取坐标位置
  10. 微信小程序即时聊天前后端(TP5+Gateway)