在上一篇【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项需要手动改,但还算完美。

更多相关文章

  1. cocos2d-x学习笔记 如何将win32移植到android
  2. 基于Android(安卓)5.0的源码编译过程
  3. 开源框架和开源项目
  4. Android(安卓)Manifest merger failed with multiple errors,see
  5. .net程序员转战android第一篇---环境部署
  6. Android中jar包封装及调用中出现的问题及解决方案
  7. ANT学习、keystore制作,APK签名
  8. 长期承接WP7,iPhone,iPad,Android等项目外包
  9. Android(安卓)studio调用第三方aidl

随机推荐

  1. Android 上实现水波特效
  2. Android 中文 API (35) ―― ImageSwitcher
  3. android layout 研究
  4. android 控件的使用 备注
  5. Android系统终端环境配置
  6. [置顶] Android基于XMPP Smack及Openfire
  7. 布局文件中的笔记
  8. 在 Android 中使用各种控件(View)
  9. Android——操作摄像头、图片合成
  10. 【转】善用Android预定义样式来为我们的