Android 深入研究JNI详解.pdf

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android 深入研究JNI详解.pdf

JavaNative Interface (JNI)标准是java 平台的一部分,它允许Java 代码和其他语言写的代码进行 交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它 编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。 1.从如何载入.so 档案谈起 1.从如何载入.so 档案谈起 11..从从如如何何载载入入..ssoo档档案案谈谈起起 由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode 之后,必须靠Dalvik虚拟机(VM: Virtual Machine)来执行。VM在Android平台里,扮演很重 要的角色。 此外,在执行Java类的过程中,如果Java类需要与C组件沟通时,VM就会去载入C 组件,然后让Java的函数顺利地调用到C组件的函数。此时,VM扮演着桥梁的角色,让Java 与C组件能通过标准的JNI介面而相互沟通。 应用层的Java类是在虚拟机(VM:VitualMachine)上执行的,而C件不是在VM上执行, 那么Java程式又如何要求VM去载入(Load)所指定的C组件呢? 可使用下述指令: System.loadLibrary(*.so的档案名); 例如,Android框架里所提供的MediaPlayer.java类,含指令: java代码: 1. public class MediaPlayer{ 2. static { 3. System.loadLibrary(“media_jni”); 4. } 5. } 复制代码 这要求VM去载入Android的/system/lib/libmedia_jni.so档案。载入*.so之后,Java 类与*.so档案就汇合起来,一起执行了。 2.如何撰写*.so 的入口函数 2.如何撰写*.so 的入口函数 22..如如何何撰撰写写**..ssoo的的入入口口函函数数 —- JNI_OnLoad()与JNI_OnUnload()函数的用途 当Android的VM(VirtualMachine)执行到System.loadLibrary()函数时,首先会去执 行C组件里的JNI_OnLoad()函数。它的用途有二: (1)告诉VM此C组件使用那一个JNI版本。如果你的*.so档没有提供JNI_OnLoad()函数, VM会默认该*.so档是使用最老的JNI 1.1版本。由于新版的JNI做了许多扩充,如果需要使用 JNI的新版功能,例如JNI 1.4的java.nio.ByteBuffer,就必须藉由JNI_OnLoad()函数来告知 VM。 (2)由于VM执行到System.loadLibrary()函数时,就会立即先呼叫JNI_OnLoad(),所以 C组件的开发者可以藉由JNI_OnLoad()来进行C组件内的初期值之设定(Initialization) 。 例如,在Android的/system/lib/libmedia_jni.so档案里,就提供了JNI_OnLoad() 函数,其程式码片段为: java代码: 1. //#define LOG_NDEBUG 0 2. #define LOG_TAG “MediaPlayer-JNI” 3. jint JNI_OnLoad(JavaVM* vm, void* reserved) 4. { 5. JNIEnv* env = NULL; 6. jint result = -1; 7. if (vm-GetEnv((void**) env, JNI_VERSION_1_4) != JNI_OK) { 8. LOGE(“ERROR: GetEnv failed\n”); 9. goto bail; 10.} 11.assert(env != NULL); 12.if (register_android_media_MediaPlayer(env) 0) { 13.LOGE(ERROR: MediaPlayer native registra

文档评论(0)

tangtianbao1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档