博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【OpenCV for Android】Android Studio JNI和NDK配置及采坑记录
阅读量:5064 次
发布时间:2019-06-12

本文共 3980 字,大约阅读时间需要 13 分钟。

在配置好Android studio的OpenCV环境后,我们就可以通过Java代码调用OpenCV的API了,但是在通常情况下,用Java代码编写图像处理算法的运行效率是没有C++代码高的,在应用层使用Java处理图像耗时非常长,往往达不到想要的效果,而Android的NDK和Java的JNI恰好满足了Android移动端对C++编程的支持,在应用层和原生层起到桥梁的作用。

JNI和NDK

JNI是Java Native Interface的缩写,即 Java本地接口,其作用是提供若干API,使Java 能与本地其他类型语言(如C、C++)交互。NDK是Native Development Kit的缩写,是 Android的一个工具开发包, 其作用是使开发者能快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK。有了这两样,我们就可以通过NDK在Android中使用JNI与本地代码(C、C++)进行交互,将高耗时的图像算法使用C++代码实现,然后由Java应用层调用得到结果并展示。

下载NDK

1. 在官网下载NDK r16b版本的安装压缩包,下载地址:

2. 下载后解压,相关文件如下:

导入NDK

打开Android Studio,点击file-->project structure

点击sdk location,选择刚才解压的NDK文件的文件夹路径,点击OK即可。

在工程中添加JNI

方式一:新建工程,勾选include C++ support

方式二:在已有工程中添加JNI

1. 在已有的工程中创建cpp文件夹。

app/src/main/下创建cpp目录,并在此目录下添加cpp文件,文件名为native-lib.cppcpp文件使用了android 创建cmake项目时的默认demo文件

2. 创建CMakeLists.txt文件,在app/目录下创建CMakeLists.txt文件,并在cmakeList.txt 文件添加编译描述。 

3. 修改appbuild.gradle,在build.gradle中增加对Cmake的支持

4. 在Java中调用,

 

package www.edgematch.com.myjni;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    // Used to load the 'native-lib' library on application startup.    static {        System.loadLibrary("native-lib");    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // Example of a call to a native method        TextView tv = (TextView) findViewById(R.id.sample_text);        tv.setText(stringFromJNI());    }    /**     * A native method that is implemented by the 'native-lib' native library,     * which is packaged with this application.     */    public native String stringFromJNI();}

提示无法找到so

1.提示找不到编译之后的native-libso文件,即未编译,

解决方法:

1)在app.gradle中添加如下代码,然后重新编译工程,若不起作用,则继续执行(2)。

2)将libs文件夹下的文件除armeabi-v7a外全部删除,然后重新编译工程,build文件夹则会生成相应的so文件。

OpenCV环境配置

在网上查了很多资料,有的配置方法需要添加Android.mkApplication.mk文件什么的非常复杂,后来参考了 的做法,直接一步到位,不需要其他繁琐操作,我们只需要在CMakeLists.txt中修改如下:红框中为设置为自己的OpenCV Android sdk路径。

# For more information about using CMake with Android Studio, read the# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_required(VERSION 3.4.1)# ##################### OpenCV 环境 #############################设置OpenCV-android-sdk路径set( OpenCV_DIR E:/AndroidOpenCV/OpenCV-android-sdk/sdk/native/jni )find_package(OpenCV REQUIRED )if(OpenCV_FOUND)    include_directories(${OpenCV_INCLUDE_DIRS})    message(STATUS "OpenCV library status:")    message(STATUS "    version: ${OpenCV_VERSION}")    message(STATUS "    libraries: ${OpenCV_LIBS}")    message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")else(OpenCV_FOUND)    message(FATAL_ERROR "OpenCV library not found")endif(OpenCV_FOUND)# ###################### 项目原生模块 ###########################add_library( identify-lib             SHARED             src/main/cpp/identify-lib.cpp src/main/cpp/edgeGradientMatching.cpp src/main/cpp/OpenCVAndroidFunction.h)target_link_libraries( identify-lib                       ${OpenCV_LIBS}                       log                       jnigraphics)

接下来就可以在cpp文件中导入opencv头文件在c++代码中其API了

添加的cpp文件无法显示或编译不通过

我们在cpp文件夹下添加其他cpp文件时,Android Studio会显示如下提示,

android studio :The file is not part of the project.Please include it ...

解决方法:打开CMakeLists.txt文件,在add_library中添加新的cpp文件和头文件的名称,如下,

 

点击sync now,则提示语句消失,代码编译成功。

 

error: cannot use typeid with -fno-rtti

出现这个错误是因为AS关闭了RTTIRuntime Type Information Support)的支持。

解决办法:打开build.gradle文件,在cppFlags中添加-frtti标识,Gradle 会将其传递到 CMake,错误即可消除。

error: cannot use 'try' with exceptions disablederror: cannot use 'throw' with exceptions disabled

NDK编译错误,这是由于 CPP文件中使用了C++ 标准异常,而 Android NDK 编译器默认不支持 C++ 异常控制导致。在使用NDK13b 的时候报错,使用升级版本到NDK16b时,运行编译则不会出错,所以当出现这个错误时可以通过使用高版本的NDK解决。下载地址:

 

 

OK,万事俱备,接下来就可以愉快的写代码了。

 

转载请注明出处:https://www.cnblogs.com/White-xzx/p/9563555.html

 

转载于:https://www.cnblogs.com/White-xzx/p/9563555.html

你可能感兴趣的文章
centos下安装nginx
查看>>
redis集群如何清理前缀相同的key
查看>>
linux的学习系列 9--网络通信
查看>>
redis7--hash set的操作
查看>>
20.字典
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
oracle用户锁定
查看>>
(转)盒子概念和DiV布局
查看>>
Android快速实现二维码扫描--Zxing
查看>>
获取元素
查看>>
nginx+lighttpd+memcache+mysql配置与调试
查看>>
ubuntu12.04 启动apache2 对.htaccess 的支持
查看>>
proxy写监听方法,实现响应式
查看>>
前端工具----iconfont
查看>>
Azure Site Recovery 通过一键式流程将虚拟机故障转移至 Azure虚拟机
查看>>
Hello China操作系统STM32移植指南(一)
查看>>
cocos2dx CCEditBox
查看>>
VC++2012编程演练数据结构《8》回溯法解决迷宫问题
查看>>
第一阶段冲刺06
查看>>
WIN下修改host文件并立即生效
查看>>