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.新建项目】

Android Studio中使用jni进行opencv开发的环境配置方法

选中"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代码时的库目录。

Android Studio中使用jni进行opencv开发的环境配置方法

创建好如图的目录以后,将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

标签:Android,Studio,jni,opencv
0
投稿

猜你喜欢

  • Spring Boot 实现https ssl免密登录(X.509 pki登录)

    2023-07-28 18:46:11
  • Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer异常

    2022-07-03 11:12:34
  • Java算法之最长公共子序列问题(LCS)实例分析

    2022-12-06 08:31:42
  • C#使用WebClient登录网站并抓取登录后的网页信息实现方法

    2022-05-19 10:43:24
  • Java网络编程TCP实现聊天功能

    2023-12-01 17:05:35
  • C++详细讲解继承与虚继承实现

    2022-10-25 18:33:49
  • SpringBoot集成支付宝沙箱支付的实现示例

    2023-10-31 19:22:20
  • Java 数据结构与算法系列精讲之贪心算法

    2023-09-12 17:56:13
  • Android使用setContentView实现页面的转换效果

    2021-07-30 15:13:32
  • Java初学者常问的问题(推荐)

    2023-05-29 05:41:51
  • android仿微信通讯录搜索示例(匹配拼音,字母,索引位置)

    2023-02-22 16:18:35
  • 详解Java 自动装箱与拆箱的实现原理

    2022-08-16 11:35:51
  • 一篇文章带你深入了解Java线程池

    2021-11-22 21:59:42
  • C#函数out多个返回值问题

    2022-11-14 21:58:55
  • MybatisPlus实现简单增删改查功能

    2021-12-27 06:25:21
  • C# List 并发丢数据问题原因及解决方案

    2023-06-18 17:53:54
  • Android开发input问题解决分析

    2021-11-10 08:58:46
  • SpringBoot 内置工具类的使用

    2021-08-26 11:42:21
  • java二维数组实现推箱子小游戏

    2022-08-31 10:18:40
  • 详解SpringBoot2.0的@Cacheable(Redis)缓存失效时间解决方案

    2023-07-23 07:20:54
  • asp之家 软件编程 m.aspxhome.com