本文是系列文章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模块,而且还修改了源码,所以才有此编译。
(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,表示感谢。
(1)使用管理员权限打开cmd(官方不建议使用cygwin)
cd到编译输出目录,在这里是D:/Android/opencv_android,然后执行mingw32-make
如果如上图没有报错,再输入mingw32-make install
install成功后,SDK被安装在D:\Android\opencv_android\install目录下,可以对比下官方目录基本一致,多了opencv_contrib模块的内容。
好像只有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
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
感谢以上两位博主!