一 概述
本文介绍OpenCV开发中SDK制作相关问题:
- 如何将sdk打包为arr依赖
- sdk中含有jni如何处理
二 OpenCV人脸识别的依赖关系
2.1 示例项目的关系图

2.2 说明
- face-detection示例依赖于opencv-sdk
- so文件的生成路径有2个,一个是app目录下的jni文件夹,另一个是opencv_sdk下的native/jni
- 若直接对opencv_sdk执行打包输出arr时,jni下的so文件也会被打包进arr内部
三 将sdk打包为arr依赖
3.1 opencv-sdk下的build/gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| android { compileSdkVersion 26 defaultConfig { minSdkVersion 21 targetSdkVersion 26 versionCode openCVersionCode versionName openCVersionName externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" targets "opencv_jni_shared" } } } //....此处省略部分代码 sourceSets { main { jniLibs.srcDirs = ['native/libs'] java.srcDirs = ['java/src'] aidl.srcDirs = ['java/src'] res.srcDirs = ['java/res'] manifest.srcFile 'java/AndroidManifest.xml' } } externalNativeBuild { cmake { path(project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt') } } }
|
3.2 将sdk打包为arr
将module opencv_sdk打包输出为arr,可以通过如下两种方式:
工具栏制作arr
选中opencv_sdk,依次点击:Build—>Make Module 'xxx'

指令执行完毕后,在opencv_sdk的build/outputs/arr目录下查看arr依赖

Gradle制作arr
打开android studio右侧的Grande窗口,找到opencv_sdk下面的Tasks/build/assembleRelease指令

右键运行后,在opencv_sdk的build/outputs/arr目录下查看arr依赖

3.3 Analyze arr
依次点击:Build——>Analyze APK,选择opencv_sdk下的arr

分析完成后,显示arr包含的内容(so文件被打包进了arr,导致arr过大)

四 sdk中含有jni处理
4.1 如何处理
- opencv_sdk中含有jni,导出为arr时,jni会生成so文件包含在arr内部,导致arr体积过大
- 我们可以选择指定ABI版本的so文件集成到app下的jni目录下
- 将arr中不在包含so文件,只导出java、res、AndroidManifest等文件
4.2 除去arr中so文件
将opencv_sdk/build.gradle中关于cmake相关操作去除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| //第一处 externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" targets "opencv_jni_shared" } } //第二处 sourceSets { main { //jniLibs.srcDirs = ['native/libs'] java.srcDirs = ['java/src'] aidl.srcDirs = ['java/src'] res.srcDirs = ['java/res'] manifest.srcFile 'java/AndroidManifest.xml' } } //第三处 externalNativeBuild { cmake { path(project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt') } }
|
重新执行assembleRelease,并查看Analyze APK
