[安卓开发笔记一]Android开发配置opencv环境超详细教程

[安卓开发笔记一]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:需要翻墙,不知道如何翻墙的,参考如下网址

google翻墙

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
  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值