您的位置:首页 > 移动开发 > Android开发

Android Studio 2.2 让你5分钟配置好 OpenCV for Android(java层和native层都可以使用)

2016-11-03 14:04 603 查看

原创不易,转载请附上原文链接。

背景介绍

最近因为项目需要,要在Android Studio上使用OpenCV,在网上查看了一下,都是使用Android.mk这种ndk-build的形式来配置环境的,步骤繁琐不说,关键是没有好好利用Android Studio 2.2的新功能,即没有代码提示和补全,及代码调试功能。Android Studio 2.2之后采用CMake来编译ndk,并且支持在Android Studio上面直接编写,编译和调试代码(很屌有木有!)也就是说你不用再在另外的编辑器下面编写好C++的代码再拷过来,然后再调试了~话不多说,现在开始讲Android Studio 2.2下面配置OpenCV4Android。

文章结构

1. 前期准备工作

2. 在java层使用OpenCV的环境配置

3. 在native层使用OpenCV的环境配置

4. 在java层和native层混合使用OpenCV的环境配置

步骤

1. 前期准备工作

文章开头已经说了这是在Android Studio 2.2上面的配置,所以请确保你的Android Studio的版本已经升级到2.2及以上。

接着就要先下载ndk,在File->Settings->Appearance & Behavior -> System Settings-> Android SDK下下载相应的ndk。如图:(如果没有下载CMake和LLDB也一起下载)



下载好的ndk会放置在你本地Android SDK的Sdk目录下一个叫ndk-bundle的文件夹下。

之后前往的OpenCV官网下载相应的OpenCV for Android版本,我下载的OpenCV 2.4.11的,不过没关系。这样,前期工作就准备好了。

2. 在java层使用OpenCV的环境配置

首先,第一步当然是新建一个项目。Android Studio 2.2因为支持C++编译环境,所以在一开始那里会有个选项Include C++ Support,使用JNI的可以把这个选项勾上。虽然这里我们不用使用JNI,但是后面会使用到,所以现在还是先勾上,如图:



之后的就一路Next就好。

之后,我们把刚才下载的OpenCV for Android目录下的java文件夹作为module导入进来。路径是:E:\OpenCV-android-sdk\sdk(前面的E:\OpenCV-android-sdk换成自己相应电脑的路径)

具体步骤如图:





之后后面的不用修改,直接到最后Finish就行。

然后,一般会出现错误,这个时候,只需要将OpenCV这个module的build.gradle的版本信息改成跟app module的build.gradle的版本信息一样就行.



接着将OpenCV作为app module的Dependency导入进来就行,点击File->Project Structure,然后按照如图的顺序点击就行:





然后将OpenCV这个Moudle点击了就行。然后就可以在Java层使用OpenCV了,如图,随便写个Mat都会有代码提示:



至此,OpenCV在Java层的配置就已经完成了。

3. 在native层使用OpenCV的环境配置

(在一步是我们实验室另一个成员弄出来的)

OpenCV在Native层的配置更加简单。因为前面已经新建了项目,且已经Include C++ Support,先来看一下Android视图下这个项目的结构:



如图,项目下多了一个cpp目录,而且帮我们自动生成了一个native-lib.cpp的文件,除此之外,在最下面还有个CMakeLists.txt,接触过CMake的朋友应该都知道这个文件的出现基本就代表说这个项目是用CMake构建的了。实际上也是,点击开项目的app moudle下的build.gradle文件,会发现这么一段代码:

externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}


这里其实就指定了用cmake方式来编译JNI层。而这也是谷歌支持的方式。下面就教大家怎么在Native配置OpenCV环境。首先点开CMakeLists.txt文件,在其中加入以下几句代码:

set(OpenCV_DIR E:/OpenCV-android-sdk/sdk/native/jni)
find_package(OpenCV REQUIRED)
target_link_libraries(${OpenCV_LIBS})


如图



然后在app下的build.gradle的android{defaultConfig{}}下加入如下代码:

ndk{
abiFilters 'armeabi-v7a'
}


如图:



然后点击Sync Now就可以啦。

现在,在Native层中编写OpenCV也有会提示。如图:



以后,就可以在Native层写OpenCV的代码,关键是有代码补全提示还有同时可以调试(这部分有时间后面再讲,关于Native层代码书写调试的一些技巧),不用像以前那样每次修改都得ndk-clean和ndk-build。

4. 在java层和native层混合使用OpenCV的环境配置

要同时在java层和native层混合使用OpenCV,其实只要在java层load一个libopencv.so库就可以了。目前我还没尝试用CMakeLists去完成这个过程,我是用的gradle。首先,在Project视图下,在app/src/main目录下建立一个libs文件夹,然后再在其目录下建立子目录,对应上一步中你指定的编译平台。因为上一步中我们选的是armeabi-v7a,所以我们就只建立了armeabi-v7a目录,然后前往本地的OpenCV for Android 的libs目录下选择对应的平台,我的是E:\OpenCV-android-sdk\sdk\native\libs\armeabi-v7a,然后将里面的libopencv_java.so库文件烤到我们刚才建立的文件夹下,如图:



接着,再在app module的build.gradle的android{defaultConfig{}}加入如下代码:

sourceSets.main{
jniLibs.srcDir 'src/main/libs' //set .so files directory to libs
jni.srcDirs = [] //disable automatic ndk-build call
}


如图:



然后Sync Now,就可以在Android视图下看到app目录下多了一个jniLibs目录。

之后,再在你想要使用jni的类中load opencv_java这个库就行了。如图:



至此,所有步骤已经完成~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息