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

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

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

版权声明
原创文章,转载请说明出处:sheng-blog.cn
原文出处

文章结构:

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

使用的软件版本

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

1、NDK的安装

按草图步骤提示安装NDK、CMake和LLDB,安装好的NDK在Android SDK的sdk/ndk-bundle文件夹下。
Android studio2.2配置opencv for android(CMake方式)_第1张图片

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

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

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

Android studio2.2配置opencv for android(CMake方式)_第5张图片
然后在app下的build.gradle的android{defaultConfig{}}下加入如下代码(如图,注意大括号的包含关系):

ndk{
      abiFilters 'armeabi-v7a'
}

Android studio2.2配置opencv for android(CMake方式)_第6张图片
这里起一个过滤作用,这里应根据自己手机的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然后选择自己的路径如图:
Android studio2.2配置opencv for android(CMake方式)_第7张图片
之后后面的不用修改,直接到最后Finish就行。 导入完成后注意需将将OpenCV这个module的build.gradle的版本信息改成跟app module的build.gradle的版本信息一样。

接着点击File->Project Structure,然后按照如图的顺序点击将OpenCV作为app module的Dependency导入进来
Android studio2.2配置opencv for android(CMake方式)_第8张图片
至此,在代码里使用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库文件拷贝到我们刚才建立的文件夹下,如图:
Android studio2.2配置opencv for android(CMake方式)_第9张图片
然后如图在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
}

Android studio2.2配置opencv for android(CMake方式)_第10张图片
然后Sync Now,就可以在Android视图下看到app目录下多了一个jniLibs目录。
之后,再在你想要使用jni的类中load opencv_java这个库就行了。如图:
Android studio2.2配置opencv for android(CMake方式)_第11张图片

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

  1. 报错error cannot use typeid with fno rtti,原因是因为没有开rtti支持,也就是前面提到的新建项目时最后一个配置界面,解决办法:在app module的build.gradle的cmake {cppFlags “” }加入 “-frtti”
  2. 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

你可能感兴趣的:(opencv,安卓)