JNI/NDK开发指南(开山篇)
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643
相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术,由其做过Android的朋友,为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C或C++)来实现,然后打包成so动态库文件,并提供Java接口供应用层调用,这么做的目的主要就是为了提供应用的安全性,防止被反编译后被不法分子分析应用的逻辑。当然打包成so也不能说完全安全了,只是相对反编译Java的class字节码文件来说,反汇编so动态库来分析程序的逻辑要复杂得多,没那么容易被破解。比如百度开放平台提供的定位服务、搜索服务、LBS服务、推送服务的Android
SDK,除了Java接口的jar包之外,还有一个.so文件,这个so就是实现了Java层定义的native接口的动态库。用兴趣的朋友可以了解一下相关服务的接口:http://lbsyun.baidu.com/sdk/download。
以前公司有一个JavaWeb的项目,其中有一个用户注册的模块,需要验证用户的手机号(流程大家都懂的),由于这个项目的用户量不大,没用采用运营商的短信网关接口,直接采购了一台16口的短信猫设备和SIM卡来解决这个事情。由于短信猫设备只提供了C的接口,而Java是不能直接与C语言进行交互的,所以JNI就派上用场了,先在Java层定义好发送短信、接收短信、短信发送队列等相关native方法,然后用javah命令将定义Java native接口的class字节码文件生成.h头文件(这个后面会讲到),最后用设备场商提供的C接口来实现java的native方法,完了之后编译成dll或so动态库,提供给Java程序使用即可。
JNI在Cocos2d-x游戏引擎中也经常用到,该引擎是用纯C++开发的,而且是跨平台的,依托C++的跨平台特性,只需用C++编写一次逻辑,就可以将游戏打包发布到不同的平台(IOS、Android、WinPhone、黑莓、Linux、Windows),打包发布的细节就不在这里讨论了。如果游戏要发布到Android平台,开发过程当中,少不了C++层和Java层进行交互,比如游戏当中要打开一个网页、播放一段视频或打开一个新的窗口等,这些在C++层实现是非常麻烦的,如果用Android应用层提供的API就变得相当容易。所以这时就不得不写JNI来完成这些功能的需求。当然这些常用的JNI操作,Cocos2d-x引擎进行了封装,相关的接口定义在JniHelper.cpp这个类中,可以拿来直接使用。(后面会有例子详细介绍)
虽然现在的物联网和智能家居行业还处于萌芽状态,但随着这个时代在技术的创新与不断改进的发展下,想象5年后,物联网和智能家居行业真正成熟起来,由于Android系统的开源,自然会被各大硬件场商所采用,相当于这几年Android智能手机的市场一样,仍然可能会处于移动智能终端的霸主地位。你可能会问,但这和JNI和有什么关系呢?当各种设备接入互联网的同时,自然少不了人机交互的应用程序,当应用程序需要调用硬件特定的功能时,此时只能通过C或C++封装对应功能的JNI接口来供上层应用使用。比如要用手机中的app控制家里的电灯、窗帘、冰箱、空调等一切智能的电子设备时,自然少不了应用要和底层硬件进行通讯,至于各种智能设备的运行控制,自然是由厂商来实现,他们只需提供操作设备相关功能的接口即可。虽然厂商会封装好JNI接口,但我们也要了解下jni与java通讯的原理,以便我们在开发过程当中遇到问题时,能够快速定位到问题。这只是我对未来物联网或智能家居发展的一些猜测,欢迎大家一起讨论!
讲了这么多,我想说明的目的只有一个:JNI在未来的用途很广,现在积累技术就是为未来积累财富!有兴趣的朋友一起来和我学习JNI开发吧。后面我会写一系列从浅入深的JNI/NDK开发文章,系统的介绍JNI开发当中所涉及到的相关技术。首先会讲JNI开发的一些基础知识,每个知识点都会结合一个案例来贯通,最后讲NDK开发,NDK这块主要讲编译环境的配置、Android.mk的编写、模块的编译与NDK编译系统的介绍,因为NDK接口的开发和JNI是一样的(这里不讲NDK开发应用方面的知识)。有兴趣的朋友请关注我的博客。下面是后续文章的大纲:
1、JNI开发流程(不同操作系统环境下编译的动态库)(用一个HelloWorld示例拉开JNI开发的序幕)
2、JVM查找java native方法的规则
3、Java数据类型与JNI数据类型的映射
4、JNI基础数据类型、字符串和数组
5、C/C++调用JAVA方法和属性
6、Java调用C/C++实现的接口
7、本地方法传递自定义对象参数
8、JNI局部引用和全局引用
9、异常处理
10、多线程
11、本地代码嵌入JVM
12、JNI开发的一些注意事项
13、常见错误分享(局部引用表溢出、本地线程未附加到JVM中的问题)
14、NDK开发环境建
15、NDK编译系统详解
16、NDK开发综合实例(Android、Cocos2d-x)
JNI/NDK开发指南(开山篇)的更多相关文章
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41777471 JNI全称是Java Native Interface(Java本地接口)单 ...
- JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用
转自:http://blog.csdn.net/xyang81/article/details/44657385 这篇文章比较偏理论,详细介绍了在编写本地代码时三种引用的使用场景和注意事项.可能看 ...
- JNI/NDK开发指南(四)——字符串处理
转载请注明出处:http://blog.csdn.net/xyang81/article/details/42066665 从第三章中能够看出JNI中的基本类型和Java中的基本类型都是一一相应的,接 ...
- JNI/NDK开发指南(二)——JVM查找java native方法的规则
通过第一篇文章,大家明白了调用native方法之前,首先要调用System.loadLibrary接口加载一个实现了native方法的动态库才能正常访问,否则就会抛出java.lang.Unsatis ...
- JNI/NDK开发指南(2)
1.生成动态库.so,存放于手机的system/lib/中(APP怎样将.so存入该文件夹,奇怪?????),Java层调用JNI的类会运行静态代码System.loadLibrary("* ...
- JNI/NDK开发指南(九)——JNI调用性能測试及优化
转载请注明出处:http://blog.csdn.net/xyang81/article/details/44279725 在前面几章我们学习到了.在Java中声明一个native方法,然后生成本地接 ...
- JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899 当我们在调用一个Java native方法的时候.方法中的參数是怎样传递给C ...
- Android JNI/NDK开发教程
JNI/NDK开发指南:http://blog.csdn.net/xyang81/article/details/41759643
- JNI/NDK开发
公司的新需求终于解决完了,离测试和发布还有段时间,第一次体验了下没需求没bug的感觉,真是舒爽~然后翻了翻有什么可以学的.无意翻到了Android后期发展的五大趋势.一.性能优化.二.高级UI.三.J ...
随机推荐
- C# - 系统类 - Array类
Array类 ns:System Array是一个抽象类 表示数组 提供了创建.查找.删除.排序.修改等应用于数组的操作 此类没有公有的实例构造函数 可以使用静态方法CreateInstance创建A ...
- [转]使用Beaglebone Black的SPI
分类: Beaglebone Black2013-11-24 18:21 678人阅读 评论(6) 收藏 举报 beaglebone blackbeagleboneSPIdevice tree 目 ...
- UIStackView 看我就够了
介绍 UIStackView 是 iOS9新增的一个布局技术.熟练掌握相当节省布局时间. UIStackView 是 UIView 的子类,是用来约束子控件的一个控件.但他的作用仅限于此,他不能用来呈 ...
- tinyxml_settattr
TiXmlString& TiXmlString::assign(const char* str, size_type len) { size_type cap = capacity(); * ...
- 20160314 Request 和Response
一.Response 1.Resonse的继承结构: ServletResponse--HttpServletResponse 2.Response代表响应,于是响应消息中的 状态码.响应头.实体内容 ...
- effective c++(03)之const使用方法
char greeting[] = "hello"; char* p = greeting; //non-const pointer,non-const data const ch ...
- Java_Iterator-------迭代器配合Listarray使用,具有更多的功能(转载)
转载自:http://www.cnblogs.com/amboyna/archive/2007/09/25/904804.html 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可 ...
- 常见错误总结_1_对java类进行修改后,无法按修改的类型加载
1.这是因为没有run的原因,对类进行修改一定要run一遍 2.至于要不要重新tomcat部署,取决于你是修改了变量还是方法,拿不定的时候都重新加载一遍看看.
- javascript 布局 第20节
<html> <head> <title>页面布局</title> <style type="text/css"> bo ...
- 《程序员的思维修炼》摘抄start:2014年9月27日19:27:07
程序员的思维修炼:摘抄:考虑到社会中各个相关团体的复杂交互影响和社会的持续变化,在我看来当前最重要的两项技能就是: ▪沟通能力: ▪学习和思考能力.软件行业正在逐步提高沟通能力.特别是敏捷方法(见注解 ...