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

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环境如下:
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第1张图片
(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模块,而且还修改了源码,所以才有此编译。

win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第2张图片
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第3张图片

二、cmake编译

1.生成Makefile

(1)双击打开cmake-gui.exe
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第4张图片
(2)配置源码目录和编译目录
D:/Android/opencv-4.5.2是opencv源码所在目录,D:/Android/opencv_android是新建目录,用来保存所有编译结果。
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第5张图片
(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交叉编译
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第6张图片
在接下来出现的Specify the Toolchain file里选择NDK目录下的toolschain,而不是源码中的,据其他博主说,如果选择opencv源码中的toolschain,会出各种编译错误。。。
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第7张图片
点击finish,出现以下结果,Java wrappers:必须是YES才可以,如果不是,可能勾选了BUILD_opencv_world,取消即可。
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第8张图片
(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
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第9张图片

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

2.使用mingw编译

(1)使用管理员权限打开cmd(官方不建议使用cygwin)
cd到编译输出目录,在这里是D:/Android/opencv_android,然后执行mingw32-make
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第10张图片
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第11张图片

如果如上图没有报错,再输入mingw32-make install
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第12张图片
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第13张图片
install成功后,SDK被安装在D:\Android\opencv_android\install目录下,可以对比下官方目录基本一致,多了opencv_contrib模块的内容。
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第14张图片


三、编译问题

问题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,保存后重新编译
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib_第15张图片
解决办法来源:https://blog.csdn.net/weixin_37993251/article/details/88054384
感谢以上两位博主!

你可能感兴趣的:(Android,opencv,opencv,android)