javaJNI编程指南

javaJNI编程指南

ID:41037580

大小:435.00 KB

页数:87页

时间:2019-08-14

javaJNI编程指南_第1页
javaJNI编程指南_第2页
javaJNI编程指南_第3页
javaJNI编程指南_第4页
javaJNI编程指南_第5页
资源描述:

《javaJNI编程指南》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、AndroidJNI知识简介JavaNativeInterface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够与用其它编程语言(如C、C++和汇编语言)编写的应用程序和库进行交互操作。1.从如何载入.so档案谈起由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM:VirtualMachine)来执行。VM在Android平台里,扮演很重要的角色。此

2、外,在执行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类,含指令:publicclassM

3、ediaPlayer{static{System.loadLibrary("media_jni");}}这要求VM去载入Android的/system/lib/libmedia_jni.so档案。载入*.so之后,Java类与*.so档案就汇合起来,一起执行了。2.如何撰写*.so的入口函数----JNI_OnLoad()与JNI_OnUnload()函数的用途当Android的VM(VirtualMachine)执行到System.loadLibrary()函数时,首先会去执行C组件里的JNI_OnLoad()函数。它的用途有二:(1)告诉VM

4、此C组件使用那一个JNI版本。如果你的*.so档没有提供JNI_OnLoad()函数,VM会默认该*.so档是使用最老的JNI1.1版本。由于新版的JNI做了许多扩充,如果需要使用JNI的新版功能,例如JNI1.4的java.nio.ByteBuffer,就必须藉由JNI_OnLoad()函数来告知VM。(2)由于VM执行到System.loadLibrary()函数时,就会立即先呼叫JNI_OnLoad(),所以C组件的开发者可以藉由JNI_OnLoad()来进行C组件内的初期值之设定(Initialization)。例如,在Android的/

5、system/lib/libmedia_jni.so档案里,就提供了JNI_OnLoad()函数,其程式码片段为://#defineLOG_NDEBUG0#defineLOG_TAG"MediaPlayer-JNI"jintJNI_OnLoad(JavaVM*vm,void*reserved){JNIEnv*env=NULL;jintresult=-1;if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){LOGE("ERROR:GetEnvfailed");gotobail;}assert

6、(env!=NULL);if(register_android_media_MediaPlayer(env)<0){LOGE("ERROR:MediaPlayernativeregistrationfailed");gotobail;}if(register_android_media_MediaRecorder(env)<0){LOGE("ERROR:MediaRecordernativeregistrationfailed");gotobail;}if(register_android_media_MediaScanner(env)<

7、0){LOGE("ERROR:MediaScannernativeregistrationfailed");gotobail;}if(register_android_media_MediaMetadataRetriever(env)<0){LOGE("ERROR:MediaMetadataRetrievernativeregistrationfailed");gotobail;}/*success--returnvalidversionnumber*/result=JNI_VERSION_1_4;bail:returnresult;}此

8、函数回传JNI_VERSION_1_4值给VM,于是VM知道了其所使用的JNI版本了。此外,它也做了一些初期的动作(可呼叫任何本地函数)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。