首页 > 系统 > Android > 正文

Android studio2.2配置opencv for android(CMake方式)

2019-11-07 23:52:36
字体:
来源:转载
供稿:网友

Android studio2.2配置opencv for android(CMake方式)

由于项目需要不得不从原来的eclipse转到android studio下使用opencv for android,AS2.2已经开始支持CMake方式开发NDK,但网上大多数教程仍是使用application.mk的老方式。而使用新方式不仅配置简单,而且可以获得native代码的自动提示、调试、自动补全。在参考了几篇博文下,终于搞出来了,其中碰到一些问题,这些博客并没有提到,所以特此写下整个配置过程及一些可能遇到的问题的解决方案。

文章结构:

Android studio22配置opencv for androidCMake方式1NDK的安装2native层使用opencv的配置过程3java层使用opencv的配置过程4遇到的一些问题以及解决方法5参考资料

使用的软件版本

android studio 2.2.3opencv for android (下载链接:opencv官网下载 )我使用的版本是3.2.0

1、NDK的安装

按草图步骤提示安装NDK、CMake和LLDB,安装好的NDK在Android SDK的sdk/ndk-bundle文件夹下。 NDK的安装

2、native层使用opencv的配置过程

首先新建项目,勾选C++的支持 新建项目 继续,Minimum sdk版本建议最好选择API21以上,除非手头设备安卓系统版本低 SDK选择 再继续,最后这个配置界面千万记得勾选,我当时此处没勾,后面报错找了好久才找到解决方案,具体报错内容最后再说 C++的配置 点开CMakeLists.txt文件,如图,在其中加入以下几句代码:

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

CMakeLists.txt的修改 然后在app下的build.gradle的android{defaultConfig{}}下加入如下代码(如图,注意大括号的包含关系):

ndk{ abiFilters 'armeabi-v7a'}

这里写图片描述 这里起一个过滤作用,这里应根据自己手机的CPU类型来进行选择。

*安卓设备的CPU类型:

armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。x86: 平板、模拟器用得比较多。x86_64: 64位的平板。

至此,只要包含opencv的头文件就可以愉快地在native层使用opencv了,当然,注意把函数写在extern “C” {}块里,其目的是使这部分代码块表按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。这样在类C的代码中就可以调用C++的函数or变量等。如果不这么写,程序会闪退,logcat报错“No implementation found for ‘you native method name’”

而且,使用时只需在java层用native关键字声明native层的函数,然后按ALT+ENTER选第一项即可在cpp文件里自动生成函数头,而不再需要像老方法一样使用javah来获得正确的函数头。

自动生成函数头

当然,如果需要调用摄像头和读取文件,别忘了在AndroidManifest.xml加上用到的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/> <uses-feature android:name="android.hardware.camera.front" android:required="true"/> <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="true"/>

3、java层使用opencv的配置过程

一般native层配合java层一起使用opencv才舒服,当然,简单一些的应用直接在java层使用opencv也是不错,若如此,前面native层的配置就不用了,当然,新建工程时自然也不需要勾选C++的支持。

我们把刚才OpenCV for Android目录下的java文件夹作为module导入进来。具体步骤是File->new->import module然后选择自己的路径如图: 导入java支持 之后后面的不用修改,直接到最后Finish就行。 导入完成后注意需将将OpenCV这个module的build.gradle的版本信息改成跟app module的build.gradle的版本信息一样。

接着点击File->PRoject Structure,然后按照如图的顺序点击将OpenCV作为app module的Dependency导入进来 导入opencv module 至此,在代码里使用opencv就会有补全提示了,参考的博文里提到配置到这就可以顺利在java层使用opencv,然而经检验发现这还不够,虽然编译不报错,可以生成apk并顺利部署,但尝试运行却会闪退报错。因而还需继续进行配置。还需要在java层load一个libopencv_java3.so(3.0版本)或libopencv_java.so(2.4版本)库。

首先,在app/src/main目录下建立一个libs文件夹,然后再在其目录下建立子目录,对应指定的编译平台。然后前往本地的OpenCV for Android 的libs目录下选择对应的平台,我的是E:/Android/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a,然后将里面的libopencv_java3.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}

build.gradle的修改 然后Sync Now,就可以在Android视图下看到app目录下多了一个jniLibs目录。 之后,再在你想要使用jni的类中load opencv_java这个库就行了。如图: load opencv_java

4、遇到的一些问题以及解决方法

报错error cannot use typeid with fno rtti,原因是因为没有开rtti支持,也就是前面提到的新建项目时最后一个配置界面,解决办法:在app module的build.gradle的cmake {cppFlags “” }加入 “-frtti”Camera2 报错,原因是安卓从API21才开始引入Camera2,这就是前面建议最低SDK选择API21的原因,如果设备系统版本太低,那就删吧。

5、参考资料

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

使用Android Studio 2.2和Cmake (CMakeLists)让OpenCV 飞起来

我的Android进阶之旅——>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

Error: package android.hardware.camera2 does not exist OpenCV

Error: Cannot use typeid with -fno-rtti
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表