NDK初体验之OpenCV sdk调用

编译来自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操作时,需要在包名的最上层目录下执行!!!!!

你可能感兴趣的:(NDK初体验之OpenCV sdk调用)