【OpenCV3.3】搭建VS2017+Android开发环境

        在上一篇【OpenCV3.3】编译源码并搭建VS2017+Windows开发环境中我们搭建了OpenCV的Windows开发环境,现在我们来搭建Android的C++开发环境。本文假设读者的VS2017已经能够正常编译出Android程序,使用的NDK版本是r13b (VS2017 15.3内建支持的NDK版本)。

        编译Android版本OpenCV涉及到交叉编译,相比Windows复杂得多,为此官方提供了编译好的静态库供开发者使用,首先我们来简单看看OpenCV SDK如何使用:

  1. 下载SDK包: opencv-3.3.0-android-sdk.zip,并解压
  2. 我们首先关注路径\opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native,可以看到该目录下的libs3rdparty\libs子目录里存放着各CPU架构的静态库.a;
    同时我们看到\opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native\jni\include目录里存放着所需要的头文件。
  3. 上面的几个目录分别就是Library和Include需要配置的目录,在我们的Android项目属性里配置好相应路径就可以了:
        Include目录: \opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native\jni\include
        Library目录:  \opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native\libs\$(TargetArchAbi)
                            
    \opencv-3.3.0-android-sdk.zip\OpenCV-android-sdk\sdk\native\3rdparty\libs\$(TargetArchAbi)
  4. 打开C++异常(-fexceptions)和运行时类型信息(-frtti),分别在C++属性设置的`代码生成`和`语言`里;否则\opencv2\flann\any.h会出现编译错误(个人表示不喜欢any_cast这种依赖于运行时类型信息和异常的机制)。
  5. Clang/GCC似乎不支持像MSVC那样直接在源码里指定链接库(实际上编译和链接是两个不相关的过程,在编译阶段影响链接阶段也似乎不是很合理),所以在迁移代码的时候需要在Linker->Library Dependencies里添加依赖库,顺便提下这里和Windows添加依赖库有一些不同,*nix系统都是如此,指定依赖库时不需要前缀lib也不需要后缀.a或.so,比如你添加liblibpng.alibopencv_dnn.a这两个依赖库,只需要输入libpng;opencv_dnn即可,此外.so也是可以被链接的,链接.so就和windows平台使用.dll一样,最后运行时动态链接。

        到此为之,不出意外的话我们已经能够在Android上跑OpenCV的程序了,很简单不是?但是如果我们要自行编译OpenCV,比如Github上有新的commits想试试,或者想对源码进行微调等等,就不是那么容易了。这里首先因为CMake尚不支持生成VS上的Android项目*,其次OpenCV项目太庞大不适合人工生成,所以先暂且放弃使用VS编译Android版本OpenCV的想法,等哪天实现了再来更新;而通过命令行进行Build的话,官方已经有文档了,写的也比我好,就不重复了,参考http://code.opencv.org/projects/opencv/wiki/Building_OpenCV4Android_from_trunk

        *ps: 严格来讲是CMake GUI,笔者尝试使用cmake和VS迁移一个项目到Android,指定的toolchain file是从https://github.com/taka-no-me/android-cmake获取的,不过上面的版本几年不维护了,配合高版本cmake使用会出一些问题,改到最后发现虽然目标是生成Android项目,但是CMake却依旧去检测MSVC而不是arm-linux-androideabi工具链,方向都错了不是,果断弃坑,改换手工生成VS的Android项目,虽然一些config.h项需要手动改,但还算完美。

你可能感兴趣的:(C/C++,Android,图像处理)