一 概述
本文介绍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
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相关操作去除
//第一处
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