【OpenCV for Android】Android Studio JNI和NDK配置及采坑记录
在配置好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版本的安装压缩包,下载地址:https://dl.google.com/android/repository/android-ndk-r16b-windows-x86_64.zip
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.cpp。cpp文件使用了android 创建cmake项目时的默认demo文件


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

3. 修改app的build.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-lib的so文件,即未编译,

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

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


OpenCV环境配置
在网上查了很多资料,有的配置方法需要添加Android.mk和Application.mk文件什么的非常复杂,后来参考了https://www.jianshu.com/p/6e16c0429044 的做法,直接一步到位,不需要其他繁琐操作,我们只需要在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关闭了RTTI(Runtime Type Information Support)的支持。
解决办法:打开build.gradle文件,在cppFlags中添加-frtti标识,Gradle 会将其传递到 CMake,错误即可消除。

error: cannot use 'try' with exceptions disabled和error: cannot use 'throw' with exceptions disabled
NDK编译错误,这是由于 CPP文件中使用了C++ 标准异常,而 Android NDK 编译器默认不支持 C++ 异常控制导致。在使用NDK13b 的时候报错,使用升级版本到NDK16b时,运行编译则不会出错,所以当出现这个错误时可以通过使用高版本的NDK解决。下载地址:https://developer.android.google.cn/ndk/downloads/older_releases

OK,万事俱备,接下来就可以愉快的写代码了。
转载请注明出处:https://www.cnblogs.com/White-xzx/p/9563555.html
【OpenCV for Android】Android Studio JNI和NDK配置及采坑记录的更多相关文章
- 【转】 Android 开发 之 JNI入门 - NDK从入门到精通
原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub ...
- 【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通
NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...
- Android 开发 之 JNI入门 - NDK从入门到精通
NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...
- Android Studio采坑记录
折腾了几个月的Android Studio,终于在今天被我搞定了 ( ̄▽ ̄)~* 开贴记录下,免得下次再次采坑 先说下我之前电脑的环境配置吧,sdk是几年前在网上下载别人整理出来的包,一直没有更新过 ...
- Android studio 下的 NDK 配置方法和注意事项
http://blog.csdn.net/u013598660/article/details/47341963
- <Android 基础(九)> Ndk配置与Demo
介绍 The NDK is a toolset that allows you to implement parts of your app using native-code languages s ...
- Android NDK and OpenCV Development With Android Studio
Android NDK and OpenCV Development With Android Studio Hujiawei 172 2014年10月22日 发布 推荐 0 推荐 收藏 4 收藏,5 ...
- 【Android】Eclipse自动编译NDK/JNI的三种方法
[Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th 2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...
- Android Studio Jni 环境搭建
第一步:NDK环境搭建,点击下图红色框区域查看NDK下载和环境配置 安照正常情况是很慢的或者无法下载成功的,这个时候可以去下载NDK压缩包进行解压.下面给出两个下载地址 (1)官网:http://we ...
随机推荐
- 继承Tcalendar控件,让当天日期醒目显示
一.新建一控件 打开Delphi主菜单Cpmponent—New Cpmponent: 二.配置参数 点击OK键,打开Unit单元文件. 三.修改单元文件 unit LyCalendar; inter ...
- bzoj 1050 [HAOI2006]旅行comf (并查集)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1050 思路: 先将每条边的权值排个序优先小的,然后从小到大枚举每一条边,将其存到并查集 ...
- Could not load file or assembly 'Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies
my shurufa huai diao le 1\ first you need install " SQLSysClrTypes_x86.msi " 2\ ...
- 洛谷 P1993 小K的农场 解题报告
P1993 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...
- java JNative调用DLL中带引用类型的方法
DLL中的被调函数有两个参数,第二个参数是int64类型的引用类型,因此创建8byte的MemoryBlock: JNative n = null; try { n = new JNative( ...
- 2019.2.28&2019.3.1 考试
因为没A/改几道题,就一起写了 题目在LOJ上都能找到 2019.2.28 100+20+12 前两个小时一直在睡觉+想题也没思路,我太菜了 T1 洗衣服 分开处理出洗衣服和烘干的时间,然后一边正着排 ...
- 【疑点】js中的break,continue和return到底怎么用?
转: [疑点]js中的break,continue和return到底怎么用? 为什么要说个?好像很简单,但是我也会迷糊,不懂有时候为什么要用return,然而break和continue也经常和他放在 ...
- Hadoop生态圈-Kafka的新API实现生产者-消费者
Hadoop生态圈-Kafka的新API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Hadoop生态圈-Kafka常用命令总结
Hadoop生态圈-Kafka常用命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.管理Kafka服务的命令 1>.开启kafka服务 [yinzhengjie@s ...
- CSS规范 - 命名规则--(来自网易)
使用类选择器,放弃ID选择器 ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用. NEC特殊字符:"-"连字符 "-"在本规范中并不表示连 ...