转载于:Android Studio OpenCV环境的简单搭建 - CSDN博客 https://blog.csdn.net/qq_18870023/article/details/58203990
简单?绝知此事要躬行!
现在回头看非常简单,但真正把它做好却很难。虽然网上都有相关的资源,但由于日期久了,而且版本不一样,导致按部就班不一定能成功,甚至有一些细节抠起来真是蛋疼,今天折磨了一个上午终于搭建好了。为了以后省点心,还是纪录一下~
因为主要以java为主开发Android,所以对于C/C++开发也就少了,所以为了效率,搭建好符合自己开发的环境也是非常重要的。所以,尽量避开一些繁杂的操作,先把工作上的需求实现了,时间允许了再细斟慢酌。
这里,主要以不需要安装OpenCVManager.apk为前提,从而使用OpenCV的java接口为目的,而且尽量避开jni开发,gradle构建,ndk构建等操作。说实话,那些mk文件和gradle命令真TM蛋疼,虽然之前有研究过,也不难,但那语法记起来是真的恶心,所以这里的搭建方法也是尽量避开这些操作。
首先,我这里的Android Studio版本略低,是1.5版本,OpenCV SDK版本最新的3.2.0,直接去官网首页就有下载了,“OpenCV for Android”。
然后,这里有官网的使用教程,教程主要是那么几步:1. 导入下载好的sdk里的java工程;2. 将该工程设置为你的项目的library,即你的项目引用该工程;3. 如果你的工程没有jni开发模块的话,直接把sdk/native/lib/目录下的,符合cpu架构的库复制到你工程的libs里,若有jni的话,就blabla….(这里不说了)4. 创建static块,加载和初始化OpenCV模块。
看起来是不是很简单?是的,但该教程是以eclipse工具做的,目前已经不用eclipse了,主要以Android Studio为主,所以,为了简单搭建,还是遵循以上教程,在Studio上摸索一番。
对于以上的几步,在Android Studio上如下对照:
1. 上面eclipse的前两步可以合成一步,eclipse上的导入project,并引用为库,在Studio就是导入Module而已。
点击File–>New–>Import Module,导入从OpenCV官网下载的SDK for Android中的java工程,/sdk/java路径下有一个openCVLibraray320的工程,然后next–>finish。
导入后,一般会报错,如下:
此时,需要把openCVLibrary320工程下的build.gradle改成你当前app工程的build.gradle,即直接将app下的build.gradle的内容copy到openCVLibrary320工程下的build.gradle,然后sync now刷新即可。
此时,还要在app工程里引用导入的module,如图。这一步可能无效(反正我这里无效,可能是studio的bug),需要手动在app的gradle.build里的dependencie节点添加该module的引用。
如果没有成功引用的话,再次打开上面那个页面,点到Dependencies页面是没有openCVLibrary320这个module的,那么手动如下:
sync 刷新后,一般会报如下的警告:
Warning:Dependency OpenCV:openCVLibrary320:unspecified on project app resolves to an APK archive which is not supported as a compilation dependency. File: D:\studio workspace\OpenCV\openCVLibrary320\build\outputs\apk\openCVLibrary320-release-unsigned.apk
这是因为刚才openCVLibrary320的build.gradle是copy app工程的build.gradle的,所以还需要改一下,如下:
到此,已经成功引用了Module了,即可以使用Module已经写好的openCV的一些类和接口
2. 将sdk/native/libs/ 目录下的符合自己工程架构的库复制到工程最外层的libs里。
上面已经完成了Module的引用,已经可以进行开发了,但还需要将一些库复制进来,因为引用的Module(java工程)有很多类的初始化和接口使用都是jni调用native代码的。
所以,将下载的SDK for Android里的native路径下的,符合自己工程cpu架构的库copy到工程的libs文件夹下,如下:
导入后,打开随便一个文件夹,你会发现若干的静态库.a文件,和一个动态库.so文件(该so很重要,调用OpenCVLoader.initDebug()函数,进行模块初始化时一定会调用该库)
但,该库只是拉到libs文件夹是不够的,这样的话打包APP时是不会打包到里面的,即不会复制该so库到APP,自然就不能调用,会报错(这坑了我很久,我还以为全是.a库,殊不知还有个.so库),所以,还是要在gradle.build里做些工作:在app的gradle.build里的android节点下加入如下代码,表示将该so库打包到APP。
sourceSets { main { jni.srcDirs = [] jniLibs.srcDirs = [‘libs’] } }
好了,以上基本环境已经搭建好了,接下来就要进入开发前的模块加载了
3. 创建static块,加载openCV模块。
直接在MainActivity里加入static块,调用OpenCVLoader.initDebug()即可,不要引用OpenCVLoader.initAsync(),该初始化是针对使用OpenCVManager.apk的情况的。
好了,基本就这样,接下来就可以做各种图片的处理开发了~
解决问题的过程是艰难的,但也是锻炼能力的好事。
</div>