编译来自OpenCV官方的示例代码FaceDetection
sdk配置
首先下载OpenCV sdk for android
https://sourceforge.net/projects/opencvlibrary/files/opencv-android/3.2.0/opencv-3.2.0-android-sdk.zip/download
解压后文件夹中含有samples代码,java库和native库以及mk脚本等文件
编译cpp源码的两种方式
cmake
一款外部构建工具,需要配置cmakelist.txt文件。看起来很复杂。
文档:https://developer.android.com/ndk/guides/cmake.html
ndk-build
易用。ndk-build脚本指向底层GNU make脚本,但是默认的make命令不能启动构建。以Android.mk为入口,及其他.mk脚本进行构建。需要学习ndk命令和mk脚本语法。
正常流程应该是
1.java代码中对native函数进行定义。
2.通过javah + 类名 命令生成对应的.h文件
3.c/cpp进行.h文件的函数实现
4.编写Android.mk文件,LOCAL_SRC_FILES用来指定要编译的c/cpp源文件,LOCAL_MODULE指定生成的so文件名等。生成的.so文件到src/main/libs下
5.在jni目录下执行ndk-build 编译c/cpp代码,生成对应的.so文件
6.所以app/build.gradle要加入将so文件打包进apk,否则loadLibrary会找不到so(掉进这个坑里很久,反复尝试才理解)
sourceSets {
main {
jni.srcDirs = [] //为ndk指定jni文件夹路径,这里是指src/main文件夹
jniLibs.srcDirs = ['src/main/libs'] //
}
}
Sample项目中native函数定义、.h文件、cpp实现和Android.mk以及Application.mk都是写好的。所以如果用gradle打包的话只需执行step 6就好。
在Sample成功运行之后,我们会完成上一篇文章《FaceDetection》的完善。
总结
ndk牵涉的知识点比较多,需要反复尝试,理解编译流程,才能把控住细节。(假大空的废话)。
补充
问题1:
javah 生成.h文件时,发生找不到xx类文件问题。
解决方法:
java系列命令对某个带包名的.class操作时,需要在包名的最上层目录下执行!!!!!