拓胜技术专家教你如何深入理解android-native

拓胜技术专家教你如何深入理解android-native

ID:8802060

大小:271.50 KB

页数:16页

时间:2018-04-08

拓胜技术专家教你如何深入理解android-native_第1页
拓胜技术专家教你如何深入理解android-native_第2页
拓胜技术专家教你如何深入理解android-native_第3页
拓胜技术专家教你如何深入理解android-native_第4页
拓胜技术专家教你如何深入理解android-native_第5页
资源描述:

《拓胜技术专家教你如何深入理解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;拓胜

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

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

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