Windows下使用android NDK(JNI)调用OpenCV本地代码——流程梳理
来源:互联网 发布:韩国研究生留学知乎 编辑:程序博客网 时间:2024/05/17 13:09
最近在弄把window下用 vs+opencv写的C代码算法打包成.so文件,供Android平台调用。从零学习Android环境的搭建,参考了各种大神的博客,使用ndk算是走通了一条路。
把整个过程梳理了一下,把参考内容也列出来,自己记录以备遗忘,也希望对和我一样的初学者有所帮助。
一,搭建Android 开发环境。
Android开发环境的搭建,包括JDK、ADT、SDK、NDK等。搭建步骤网上很多,资源下载可参考 http://www.open-open.com/lib/view/open1386252535564.html
我使用的是adt-bundle,已经包含了adt、sdk、eclipse,是一个完整的Android开发环境。中间出现的问题,打开eclipse提示adt版本太低,要求更新adt。由于众所周知的原因,谷歌网站根本无法登陆,用了代理还是慢的要死。我使用的解决方法是,找到sdk目录/tools/lib/plugin.prop,将里面的plugin.version改成已有的adt版本,即可正常运行。
建立一个最简单的Android工程,能正常输出HelloWorld就行。
二,NDK配置
NDK的配置包括路径设置、添加NativeSupport、设置C/C++的Paths and Symbols三个步骤。参考http://blog.csdn.net/u013149325/article/details/40375455
NDK调用本地C/C++文件的简单例子,可参考http://www.tuicool.com/articles/iQZr6z。当然其中头文件可以使用javah命令生成,可以在eclipse中直接生成,后面会说到。
三,添加native方法的类,并生成jni头文件
这部分内容可以网上查Java jni调用c/c++文件的内容,jni头文件生成有两种方式,一是通过命令行利用javah命令生成,二是通过在eclipse中建立编译选项直接生成。第二种方法可以参考http://blog.csdn.net/u013149325/article/details/40375455中的第八部分。
四,编写本地C/C++代码
主要是在C/C++中添加 jni.h和第三步生成的头文件,jni参数与C/C++代码中的参数对应可以查阅jni文档。这一步可以继续参考http://blog.csdn.net/u013149325/article/details/40375455
因为我主要是把调用opencv的C代码打包成.so文件,供Android使用。所以这里的一个关键问题是如何将opencv包加载进来。我的做法是直接把opencv解压缩包中build/include中的opencv2整个文件夹放到到Android工程的jni文件夹中,eclipse会自动加载opencv2文件夹中的内容。这里的opencv是使用Windows版本的opencv2库还是Android版本的opencv2库,实际中貌似这两个都行,也许这两个库本来就是一样的,有待确认。
这一步还有其他方法,可以参考 http://blog.csdn.net/u013149325/article/details/40554311 ,重点推荐http://blog.csdn.net/yanzi1225627/article/details/27863615,这位大神对于OpenCV4Android有各种深入研究,还建了人满为患的讨论群
五,配置 Android.mk和Application.mk
这两个文件的配置,可以参考http://blog.csdn.net/u013149325/article/details/40554311、http://blog.csdn.net/watkinsong/article/details/8829235,以及opencv自带文档opencv_tutorials.pdf中introduction的Android开发部分
六,生成.so文件
编译文件生成.so文件,运行程序,查看在模拟器中的运行结果。
ps.这里只是初步走通了这个流程,如何在jni环境中,像在VS中一样调试C/C++代码,有待继续学习。还有,如何在C/C++代码中根据路径读取Android平台上的图像,还没走通。
- Windows下使用android NDK(JNI)调用OpenCV本地代码——流程梳理
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)
- 在Android中使用JNI调用Opencv本地代码 配置方式 边缘检测 范例代码
- Android使用NDK(从java调用本地函数'JNI')
- Android Studio中使用JNI调用OpenCV本地代码Canny 边缘检测
- Android NDK 使用JNI调用java代码,通用代码封装
- windows jni ndk流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- 二分查找法用—for循环— 实现
- Viewpager中嵌套Listview,而且Listview的item中夹杂ViewPager
- 链表算法-链表前面插入节点
- uplevel 和 upvar
- iOS开发的知名个人博客
- Windows下使用android NDK(JNI)调用OpenCV本地代码——流程梳理
- Spring学习笔记
- 安卓基础 论MediaPlayer的应用(二)
- windos系统快捷键
- UVa10900 - So you want to be a 2n-aire? (期望)
- 5.18
- 黑马程序员-----多线程
- join(inner join)、left join、right join、full join的区别(摘自w3c)
- Message: could not initialize proxy - no Session org.hibernate.LazyInitializationException: could no