Android Studio中使用jni进行opencv开发的环境配置方法
作者:杯中月 发布时间:2021-07-26 00:02:06
使用jni进行opencv开发可以快速地将PC端的opencv代码移植到手机上,但是如何在android studio下进行配置,网上几乎找不到教程,大多都是eclipse下使用mk文件的方法,找不到使用gradle的方案,摸了几天,总算是摸清楚了。
其实找对了方法,用android studio配置环境要比eclipse简单很多,首先是预先准备的环境:
1.Android studio,官网最新版,我用的是2.3.1;
2.OpenCV4Android,官网最新版,我用的3.2.0;
就这两个就行了,不需要像eclipse一样手动配置jni啊adt啊一堆有的没的。
配置步骤如下:
【1.新建项目】
选中"Include C++ support",后面无脑next,Android会帮你把jni环境直接配置好。等gradle build完毕,可以在project窗口的Android标签页下看到有External Build Files,下面是一个CMakeList.txt文件,这个是Android Studio自动生成的一个makefile,相当于用cmake编译jni的部分,如果你cmake用得很熟练,那么只要在这个文件里配置好opencv的路径,再在gradle里加点参数就可以轻松搞定,具体过程如下:
【2.编辑CMakeList.txt】
在CMakeList.txt中增加如下条目:
#项目路径和opencv路径
set(pathToProject D:/ImageProcess/JniExample)
set(pathToOpenCv D:/OpenCV-android-sdk)
#支持-std=gnu++11
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#配置加载native依赖
include_directories(${pathToOpenCv}/sdk/native/jni/include)
#动态方式加载
add_library( lib_opencv SHARED IMPORTED )
#引入libopencv_java3.so文件
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
可以看到配置里有一个${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so文件,我们暂时还没有,需要我们手动创建相应的jniLibs目录,这个目录会被Android Studio自动识别作为编译jni代码时的库目录。
创建好如图的目录以后,将OpenCV-android-sdk\sdk\native\libs下的文件夹全部复制到jniLibs下面。
最后,在CMakeList的target_link_libraries中添加一条lib_opencv:
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib}
lib_opencv)
【3.gradle配置】
在项目根目录下新建文件夹“distribution”,将OpenCV-android-sdk\sdk\native\jni下的include文件夹拷贝过去,再将OpenCV-android-sdk\sdk\native下的libs文件夹拷贝过去。(这个方法参考了某个博客,恕我记性不好没法贴出来源……如果不拷贝直接使用OpenCV-android-sdk下的路径应该也是可以的)
在Gradle Scripts下应该有两个build.gradle,其中一个是Project的,我们不用管,打开Module:app的gradle,在最外层添加一行def lib_distribution_root = '../distribution'
在android节点的defaultconfig下添加:
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
}
}
注意这和AS自动生成的externalNativeBuild的位置是不一样的,两条都要有,再在android节点下添加:
sourceSets {
main {
jniLibs.srcDir(['${lib_distribution_root}/libs'])
}
}
如此,我们就可以在cpp文件夹中添加C++类,并使用opencv库了,注意每添加一个cpp文件都要在CMakeList中add_library下添加一个源文件路径(和通过mk文件编译一样)。
【4.OpenCV4Android和jni的联动】
我们依旧需要通过java层调用android api来获取摄像头数据,比较简便的方法是file->new->import module,选中OpenCV-android-sdk\sdk\java,把java版的opencv作为模块添加进来,然后在我们的app上右键->open module settings->dependencies->'+'->add module dependency,把opencv模块添加依赖,然后可以参考OpenCV-android-sdk\samples\tutorial-1-camerapreview来获取摄像头数据,java版的mat对象有一个GetNativeObjAddr()成员函数,获取一个long类型的mat地址,作为参数传递给native层,即可利用这个地址改变java层的mat对象,进行一系列图像处理。
来源:https://blog.csdn.net/leon0472/article/details/72818651


猜你喜欢
- 语音获取要想发送语音信息,首先得获取语音,这里有几种方法,一种是使用DirectX的DirectXsound来录音,我为了简便使用一个开源的
- 本文实例讲述了C#动态创建button的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.C
- 现在很多的javascript控件,非常的不错,其中step就是一个,如下图所示:那么如何用C#来实现一个step控件呢?先定义一个Step
- IDEA时跳转到.class的解决项目背景:jdk1.8软件环境:IDEA问题:两个不同的项目,在A项目中写了一个实体类。B项目中引用。我想
- 整理文档,搜刮出一个Android通过HTTP协议实现断点续传下载的代码,稍微整理精简一下做下分享。FileDownloader.java&
- RestTemplate设计是为了Spring更好的请求并解析Restful风格的接口返回值而设计的,通过这个类可以在请求接口时直接解析对应
- Java中如何输出像1-2-3-4-5 这样的字符抱歉对于这个问题我甚至不能想到一个合适的标题,但是不重要 以下操作基于 jdk 1.8St
- 前言:阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换消
- 1、为什么使用Spring提供的JDBC的封装?因为Spring提供了完整的模板类以及基类可以简化开发,我们只需写少量的代码即可。2、实例讲
- 效果图开发、使用环境说明安装TSC_7.3.8_M-3.exe打印机驱动,安装时选择对应的ttp 244 pro将TSCLIB.dll复制到
- @MapperScan包扫描的坑在使用通用mapper执行查询时,由于不太注意顺手就导了spring的包:import org.mybati
- 获取resources文件路径背景在SpringBoot项目中,需要获取resources文件的路径,网上找了好多文章都不行,后面还是结合官
- 1、来源random.nextInt() 为 java.util.Random类中的方法; Math.random() 为 java.lan
- 有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示U
- 效果图:A.绘制圆环,圆弧,文本//1.画圆环//原点坐标float circleX = width / 2;float circleY =
- 举一个生活中的小例子,大凡开过学或者毕过业的都会体会到这样一种郁闷:你要去 n个地方办理 n 个手续(现在大学合并后就更加麻烦,因为可能那
- 1.查找概述查找表: 所有需要被查的数据所在的集合,我们给它一个统称叫查找表。查找表(Search Table)是由同一类型的数据元素(或记
- 概述java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现
- 什么是ShiroApache Shiro是一个功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理。借助Shiro易于
- 本文为大家分享了Android TextSwitcher文本切换器的使用,供大家参考,具体内容如下1.TextSwitcher 使