[安卓开发笔记一]Android开发配置opencv环境超详细教程
【更新于 2022年4月】 再次提醒,建议现在看到这篇文章的,仅仅把此文做一个流程参考,4年前android studio就使用cmakelist编译,直接使用cmakelist编译会方便很多的哈,使用cmakelist的方法建议去android studio的官网上看有中文的文档的,本文图片由于之前存的云空间公司倒闭了,年代久远 就无法恢复了。 使用cmakelist配置更简单,只需要下载opencv库和头文件,在cmakelist中编译时link对应的库,编译为可用的so,然后在jni中引用对应头文件就能使用对应函数了。
建议现在看到这篇文章的,仅仅把此文做一个流程参考,现在as支持cmakelist编译,直接使用cmakelist编译会方便很多的哈使用cmakelist的方法建议去as的官网上看有中文的文档的 -----17-9-29
开发安卓项目时要用到opencv,在网上找了很多教程,踩了很多坑才弄好,这里将自己亲自配置的过程记录如下,方便后人
1、前期准备
1 上opencv官网,下载opencv for android
2 安装 Android studio
2、方法一(使用C++实现底层算法再利用jni传递使用)
开始配置
1.安装Android NDK
新建项目,建完后可通过Android studio下载Android NDK环境
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RvNT83U5-1658222588150)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage001.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UGHpi4wu-1658222588151)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage003.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YaryxS6i-1658222588152)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage005.png)]
一般是没有Android NDK的,勾上后点Apply,然后等它下载,安装
PS:需要翻墙,不知道如何翻墙的,参考如下网址
2 添加opencv native包
将opencv官网上下载好的opencv for Android 中的native文件夹,拷贝到建好的工程根目录下,如图
拷贝前:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3gNI68Y7-1658222588152)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage007.png)]
拷贝后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-diCs1kNI-1658222588153)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage009.png)]
3 配置编译环境
编辑gradle.properties文件,增加下面的属性使用旧版的ndk功能(不添加会使用实验性的ndk构建工具)
android.useDeprecatedNdk=true
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNwWhERv-1658222588153)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage011.png)]
在local.properties文件中配置ndk目录
ndk.dir=D:\Android\sdk\ndk-bundle
sdk.dir=D:\Android\sdk
(如果是通过Android studio 来安装的Android NDK 这一步可以不用,因为Android studio安装NDK了)自动配置好
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4KE41p8B-1658222588153)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage013.png)]
编辑build.gradle,在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'
加入前:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RWIw3aVT-1658222588154)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage015.png)]
加入后(代码太长截图没截完):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IWsyRuf8-1658222588154)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage017.png)]
在main中新建jni目录,并在jni中新建Android.mk和Application.mk
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gicuBSzm-1658222588155)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage019.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hqRbGXim-1658222588155)(http://7xqqmr.com1.z0.glb.clouddn.com/opencv_androidimage021.png)]
在Android.mk中加入如下代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OpenCV_INSTALL_MODULES := on
OpenCV_CAMERA_MODULES := off
OPENCV_LIB_TYPE :=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
include ..\..\..\..\native\jni\OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE := OpenCV
LOCAL_SRC_FILES :=
LOCAL_LDLIBS += -lm -llog
include $(BUILD_SHARED_LIBRARY)
在Application.mk中加入如下代码
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi a