- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第 * 页 Android系统移植 第八章 Java本地调用 一、java本地调用 二、jni的基本概念 三、jni的实现 四、框架层中使用jni 五、APK中使用jni 8.1 android的java本地调用 Jni是java native interface的缩写,直译中文为“java本地接口”,一般情况下称为“java本地调用”,从java1.1开始,标准规java称为java平台的一部分,他允许java代码和其他语言编写的代码进行交互,jni是本地程序接口,他使得java虚拟机(VM)内部运行的java代码能够与其他编程语言(例如:C、C++和汇编语言)编写的程序和库进行内部交互操作。 在android中提供的jni的方式,让java程序可以调用C语言编写的程序,JNI也是android系统连接本地层和java层的主要手段。 Android的jni 在android中提供的jni的方式,让java程序可以调用C语言编写的程序,android中很多java类具有native接口,这些native接口就是由本地实现,然后注册到系统中的。 在Android中主要的jni代码在一下的路径中: Frameworks/base/core/jni/这个路径中的内容将被编译成库libandroid_runtime.so,这就是一个普通的动态库,被放置在目标系统的/system/lib目录中。 除此之外,android还包含其他的jni库,录入媒体部分的jni在目录frameworks/base/media/jni中,被编译成libmedia_jni.so。 Jni中的各个文件实际上就是C++的普通文件,其命令一般和支持的java类有对应关系,这种关系式习惯上的写法,而不是强制的。 在android中实现的jni库,需要连接动态库libnativehelper.so。 Jni在android层次结构中的作用 8.1.1 android的jni实现 Jni在android层次结构中的作用如图所示: Android系统的jni和标准的java基本类似,实现jni主要的流程为在java源代码中声明本地方法, 并注册到对应的java类中,在java层的声明方面,android和标准的java使用了完全相同的方法,在本地层的实现方面,原本jni也没有绝对完整的规则,android系统具有一定的特殊性 8.1.1 android的jni实现 8.1.1 android的jni实现 Android jni本地部分主要的头文件的路径为:/dalvik/libnativehelper/include/nativehelper/jni.h Jni.h实际上是android根据java本地调用的标准写成的一个头文件,jni.h中包含了基本类型以及javaVM、JNIEnv、jclass、jmethodID、jfieldID等数据结构定义,并通过让C++层提供java环境,注册JNI方法、类的建立与异常处理。 在android中实现和使用jni一定需要jni.h文件,而通目录中的JNIHelp.h却不一定需要,也不一定需要libnativehelper.so库。 Jni.h首先完成了基本类型的定义,将java部分的基本数据结构和对象类型(java.lang.Object)对应到本地,这些数据类型也就是jni中实现方法的参数和返回值的类型。 8.1.2 android的jni实现分析(1) 如何告诉VM(虚拟机)java层需要调用native层的哪些libs? 我们知道java程序是运行在VM上的,而Native层的libs则不然。所以为了让java层能访问native层的libs,必须得告诉VM要使用哪些native层的libs。下面看一段代码 public class MediaPlayer { ... static { System.loadLibrary(media_jni); native_init(); } ... private native final void native_setup(Object mediaplayer_this); ... } 可以看到上面的代码中,在MediaPlayer类中有一段static块包围起来的代码,其中System.loadLibrary(media_jni)就是告诉VM去加载libmedia_jni.so(fs100_root/system/lib)这个动态库,那么这个动态库什么时候被加载呢?因为static语句块的原因,所以在MediaP
文档评论(0)