win10编译OpenCV4Android系列2 |
您所在的位置:网站首页 › win10编译过的hadoop273 › win10编译OpenCV4Android系列2 |
win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib
前言一、编译环境二、cmake编译1.生成Makefile2.使用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++_staticANDROID_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 #endif3,保存后,在cmake中重新configure和generate,再继续之后的步骤即可 解决办法来源:https://blog.csdn.net/coolermzb3/article/details/116278830 问题2:error: ‘::hypot’ has not been declared1,找到文件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 hypot2,保存后重新编译 解决办法来源:https://blog.csdn.net/weixin_37993251/article/details/88054384 感谢以上两位博主! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |