时间:2021-05-21
使用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++11set(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对象,进行一系列图像处理。
以上这篇Android Studio中使用jni进行opencv开发的环境配置方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
安卓项目开发中,项目中使用到jni开发,使用C/C++编写了自己的so库,调试和运行一切正常,Android.mk文件代码如下:LOCAL_PATH:=$(ca
Android开发过程中为了实现代码的高效性,通常要调用本地c++代码,JNI是java语言提供的和c/c++相互沟通的机制,在使用opencv做图像处理时,通
本文实例讲述了Android在JNI中使用ByteBuffer的方法。分享给大家供大家参考。具体如下:一、ByteBuffer定义在NIO中,数据的读写操作始终
用VS使用OpenCV的时候,又不想全局配置,每次都要配置简直烦死了。鉴于此,给大家介绍一种简便一点的方法。配置环境的前提是:成功安装了OpenCV合适的版本。
studio中碰到的jni问题最近在做supervideo,解析youku视频地址,是加过密处理,须要用对应的key去解析,获取对应数据,在引用jni时,发现接