1 前言
Android Studio在2.2版本更新之后加入了CMAKE方式配置NDK的方法,这大大简化了之前通过Android.mk和Application.mk两个本地配置文件进行NDK开发的方式。这种方法在后续更新的版本中不断增强,越来越好用,越来越不会出问题。本文基于Android Studio3.1的版本进行配置,使用CMAKE的配置方式配置OpenCV最新版(截止发文时间是OpenCV 3.4.1),并在最后给出一个灰度转换的测试Demo。
如果你想通过Android NDK开发配置OpenCV,本文或许对你有用。
2 准备工作
2.1 开发环境
- Java 8 u161
- Windows 10 Enterprise 64bit
- Android Studio 3.1
- OpenCV for Android 3.4.1
- Android NDK 16.1.4479499
- Gradle 4.4
- CMAKE
注意: NDK更迭比较快,之前一直用14R版本,配置最新版的OpenCV,貌似老出一些莫名其妙的bug,后来更新16R之后,bug莫名其妙的消失了,貌似新版本更强大,推荐用最新版。Gradle脚本大部分是AS自动配置的,一般会自动更新,但如果在update推送弹窗中点了ignore之后,会停止推送,推荐使用最新版本。
2.2 下载相关文件
OpenCV
OpenCV可以直接在官网上下,官方网址为:https://opencv.org/releases.html
选择Android pack版本即可,大约310MB,由于服务器在国外,下载速度可能会比较慢,使用迅雷要比FireFox自带的下载器快。
NDK
NDK并不会随着Android SDK自动下载,需要手动配置——
打开AS -> Settings -> Appearance & Behavior -> System Settings -> Android SDK ->SDK Tools 勾选 NDK,如果CMAKE没有勾选,也要勾选。
至此,准备工作结束。
3 OpenCV for Android的配置
3.1 创建项目
创建一个名为OpenCVTest的Android project,注意勾选include C++选项即可。
3.2 OpenCV相关文件
- include文件
在下载好的OpenCV压缩包中,打开路径下的.\opencv-3.4.1-android-sdk\OpenCV-android-sdk\sdk\native\jni
有一个include文件夹,把这个文件夹复制粘贴至我们的OpenCVTest项目中,路径为src/main/cpp
- jni文件
然后是动态库(.so文件),打开路径下的.\opencv-3.4.1-android-sdk\OpenCV-android-sdk\sdk\native
,有一个libs
文件夹,这个文件夹里面是所有版本的abi的so文件。复制粘贴到我们的项目中,路径为src/main/jniLibs
这个文件夹需要自己手动去创建。
注意:
1. 无论是include还是libs的路径都可以自定义,习惯上是这样放,但其实只要在之后的CMakeList配置文件里面设置正确就没有问题。
2. 值得一提的是,OpenCV在最新版本中把动态库和静态库分开了,分别放在libs和staticlbs两个文件夹中,之前是放在一个文件夹里的。我们测试Demo仅需要动态库和头文件即可。
最后配置好之后文件结构如图所示:
3.3 配置文件
3.3.1 build.gradle文件
在android
节点中添加如下代码:
sourceSets{
main{
jniLibs.srcDirs = ['src/main/jniLibs/libs']
}
}
这一步设置了动态链接库的路径地址,用于项目构建时,Native寻找和链接相关的so文件。
然后在Android.defaultConfig.externalNativeBuild
的节点内增加一行过滤器,如下:
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
.so文件依赖于硬件环境,不同的CPU架构对应不同的.so文件,abiFilters
关键字能够指定Android 所支持的CPU架构,一般是以上7种,最终这些.so文件会被打包进APK,所以可以根据自己的项目进行选择,比如在AS模拟器上开发APP选一个 x86
就可以了,如果是手机端,一般是arm架构,选 armeabi-v7a
即可。
最终的build.gradle文件如下: