最近项目中有使用OpenCV的要求,这对于还没有接触过NDK的我来说真是有点儿难度。
所以先从NDK的配置入手,然后又配置OpenCV,并尝试使用OpenCV来运行一些小例子。
终于步入正轨了,特来做个小总结。
一、NDK
其实,Android Studio中NDK的配置是很简单的。不需要像Eclipse中那样复杂,不必使用cygwin这一类工具来模拟Linux环境。
只需:
File ——> Project Structure——>SDK Location 最下方的选项就是NDK。只有在这里下载会自动配置各种内容。(注意,此过程有连接外网的需求,应该是在下载的最后部分)
此后,按照
http://wiki.jikexueyuan.com/project/android-actual-combat-skills/ndk-development-in-android-studio.html
介绍的关于 头文件 、 Native代码 、.so文件的内容都能完成。
注意,Android Studio 默认是没有.mk文件的。(关于.mk文件的内容还了解的不多,以后补充)如果有需求要使用自己的.mk文件,就要在自己动手修改buile.gradle文件,更改jnilibs目录。
在android {
}
内部增加一下代码:
sourceSets.main.jni.srcDirs = []
//禁止自带的ndk功能
sourceSets.main.jniLibs.srcDirs = ['src/main/libs','src/main/jniLibs']
//重定向so目录为src/main/libs和src/main/jniLibs,原来为src/main/jniLibs
task ndkBuild(type: Exec, description: 'Compile JNI source with NDK') {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkDir = properties.getProperty('ndk.dir')
if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) {
commandLine "$ndkDir/ndk-build.cmd", '-C', file('src/main/jni').absolutePath
} else {
commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath
}
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
task ndkClean(type: Exec, description: 'Clean NDK Binaries') {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkDir = properties.getProperty('ndk.dir')
if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) {
commandLine "$ndkDir/ndk-build.cmd",'clean', '-C', file('src/main/jni').absolutePath
} else {
commandLine "$ndkDir/ndk-build",'clean', '-C', file('src/main/jni').absolutePath
}
}
clean.dependsOn 'ndkClean'
二、OpenCV
OpenCV的使用方式有很多种,随着版本的更新还出现了一种使用Manager进行中间衔接的方式,但这种方式要额外安装apk(用户打开需要OpenCV的功能时,会自动获得提醒去Google Play Store下载),不是很方便,特别是国内环境。
我一般是这样初始化OpenCV
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
//用这种方式初始化需要额外安装apk(监测到没有安装会提示去google play 下载)
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
//这种方式使用本地lib
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
具体的关于OpenCV的使用可以参考:
http://blog.csdn.net/sbsujjbcy/article/details/49520791