欢迎来到天天文库
浏览记录
ID:8802060
大小:271.50 KB
页数:16页
时间:2018-04-08
《拓胜技术专家教你如何深入理解android-native》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、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类,含指令:Java代码:1
3、.publicclassMediaPlayer{2.static{3.System.loadLibrary("media_jni");4.}5.6.}7.8.复制代码 这要求VM去载入Android的/system/lib/libmedia_jni.so档案。载入*.so之后,Java类与*.so档案就汇合起来,一起执行了。 2.如何撰写*.so的入口函数 JNI_OnLoad()与JNI_OnUnload()函数的用途 当Android的VM(VirtualMachine)执行到System.loadLibrary()函数时,首先
4、会去执行C组件里的JNI_OnLoad()函数。它的用途有二: (1)告诉VM此C组件使用那一个JNI版本。如果你的*.so档没有提供JNI_OnLoad()函数,VM会默认该*.so档是使用最老的JNI1.1版本。由于新版的JNI做了许多扩充,如果需要使用JNI的新版功能,例如JNI拓胜(广州)计算机技术服务有限公司16/161.4的java.nio.ByteBuffer,就必须藉由JNI_OnLoad()函数来告知VM。 (2)由于VM执行到System.loadLibrary()函数时,就会立即先呼叫JNI_OnLoad(),所以
5、C组件的开发者可以藉由JNI_OnLoad()来进行C组件内的初期值之设定(Initialization)。 例如,在Android的/system/lib/libmedia_jni.so档案里,就提供了JNI_OnLoad()函数,其程式码片段为:Java代码:1.2.//#defineLOG_NDEBUG03.#defineLOG_TAG"MediaPlayer-JNI"4.5.jintJNI_OnLoad(JavaVM*vm,void*reserved){6.JNIEnv*env=NULL;7.jintresult=-1;8.9.i
6、f(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){10.LOGE("ERROR:GetEnvfailed");11.gotobail;12.}13.14.assert(env!=NULL);15.16.17.if(register_android_media_MediaPlayer(env)<0){18.LOGE("ERROR:MediaPlayernativeregistrationfailed");19.gotobail;20.}21.22.if(register_android_m
7、edia_MediaRecorder(env)<0){23.LOGE("ERROR:MediaRecordernativeregistrationfailed");24.gotobail;25.}26.27.if(register_android_media_MediaScanner(env)<0){28.LOGE("ERROR:MediaScannernativeregistrationfailed");29.gotobail;30.}31.32.if(register_android_media_MediaMetadataRetriev
8、er(env)<0){33.LOGE("ERROR:MediaMetadataRetrievernativeregistrationfailed");34.gotobail;拓胜
此文档下载收益归作者所有