会员注册 | 登录 | 微信快捷登录 支付宝快捷登录 QQ登录 微博登录 | 帮助中心 人人文库renrendoc.com美如初恋!
站内搜索 百度文库

热门搜索: 直缝焊接机 矿井提升机 循环球式转向器图纸 机器人手爪发展史 管道机器人dwg 动平衡试验台设计

   首页 人人文库网 > 资源分类 > DOC文档下载

23JNI与Android VM之关系.doc

  • 资源星级:
  • 资源大小:63.00KB   全文页数:5页
  • 资源格式: DOC        下载权限:注册会员/VIP会员
您还没有登陆,请先登录。登陆后即可下载此文档。
  合作网站登录: 微信快捷登录 支付宝快捷登录   QQ登录   微博登录
友情提示
2:本站资源不支持迅雷下载,请使用浏览器直接下载(不支持QQ浏览器)
3:本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

23JNI与Android VM之关系.doc

23.JNI与AndroidVM之关系1.从如何载入.so档案谈起由于Android的应用层级类别都是以Java撰写的,这些Java类别转译为Dex型式的Bytecode之后,必须仰赖Dalvik虚拟机器VMVirtualMachine来执行之。VM在Android平台里,扮演很重要的角色。此外,在执行Java类别的过程中,如果Java类别需要与C组件沟通时,VM就会去加载C组件,然后让Java的函数顺利地呼叫到C组件的函数。此时,VM扮演着桥梁的角色,让Java与C组件能透过标准的JNI接口而相互沟通。应用层级的Java类别是在虚拟机器VMVitualMachine上执行的,而C组件不是在VM上执行,那么Java程序又如何要求VM去加载Load所指定的C组件呢可使用下述指令System.loadLibrary.so的檔名例如,在上一节的范例里的NativeJniAdder类别,其程序代码看看Android框架里所提供的MediaPlayer.java类别,内含指令publicclassMediaPlayer{static{System.loadLibrarymedia_jni}..}这要求VM去加载Android的/system/lib/libmedia_jni.so档案。载入.so档之后,Java类别与.so档就汇合起来,一起执行了。2.如何撰写.so的入口函数JNI_OnLoad与JNI_OnUnload函数之用途当VM执行到System.loadLibrary函数时,首先会去执行C组件里的JNI_OnLoad函数。它的用途有二1.告诉VM此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的/system/lib/libmedia_jni.so档案里,就提供了JNI_OnLoad函数,其程序代码片段为//defineLOG_NDEBUG0defineLOG_TAGMediaPlayerJNIjintJNI_OnLoadJavaVMvm,voidreserved{JNIEnvenvNULLjintresult1ifvmGetEnvvoidenv,JNI_VERSION_1_4JNI_OK{LOGEERRORGetEnvfailed\ngotobail}assertenvNULLifregister_android_media_MediaPlayerenvGetEnvvoidenv,JNI_VERSION_1_4JNI_OK{LOGEERRORGetEnvfailed\ngotobail}}由于VM通常是多执行绪Multithreading的执行环境。每一个执行绪在呼叫JNI_OnLoad时,所传递进来的JNIEnv指标值都是不同的。为了配合这种多执行绪的环境,C组件开发者在撰写本地函数时,可藉由JNIEnv指标值之不同而避免执行绪的数据冲突问题,才能确保所写的本地函数能安全地在Android的多执行绪VM里安全地执行。基于这个理由,当在呼叫C组件的函数时,都会将JNIEnv指标值传递给它,如下jintJNI_OnLoadJavaVMvm,voidreserved{JNIEnvenvNULL.ifregister_android_media_MediaPlayerenvMonitorEnterenv,objJNI_OK{.}查看是否已经有其它执行绪进入此对象,如果没有,此执行绪就进入该对象里执行了。还有,也可撰写下述指令ifenvMonitorExitenv,objJNI_OK{}查看是否此执行绪正在此对象内执行,如果是,此执行绪就会立即离开。3.registerNativeMethods函数之用途应用层级的Java类别透过VM而呼叫到本地函数。一般是仰赖VM去寻找.so里的本地函数。如果需要连续呼叫很多次,每次都需要寻找一遍,会多花许多时间。此时,组件开发者可以自行将本地函数向VM进行登记。例如,在Android的/system/lib/libmedia_jni.so档案里的程序代码片段如下//defineLOG_NDEBUG0defineLOG_TAGMediaPlayerJNIstaticJNINativeMethodgMethods{{setDataSource,Ljava/lang/StringV,voidandroid_media_MediaPlayer_setDataSource},{setDataSource,Ljava/io/FileDescriptorJJV,voidandroid_media_MediaPlayer_setDataSourceFD},{prepare,V,voidandroid_media_MediaPlayer_prepare},{prepareAsync,V,voidandroid_media_MediaPlayer_prepareAsync},{_start,V,voidandroid_media_MediaPlayer_start},{_stop,V,voidandroid_media_MediaPlayer_stop},{getVideoWidth,I,voidandroid_media_MediaPlayer_getVideoWidth},{getVideoHeight,I,voidandroid_media_MediaPlayer_getVideoHeight},{seekTo,IV,voidandroid_media_MediaPlayer_seekTo},{_pause,V,voidandroid_media_MediaPlayer_pause},{isPlaying,Z,voidandroid_media_MediaPlayer_isPlaying},{getCurrentPosition,I,voidandroid_media_MediaPlayer_getCurrentPosition},{getDuration,I,voidandroid_media_MediaPlayer_getDuration},{_release,V,voidandroid_media_MediaPlayer_release},{_reset,V,voidandroid_media_MediaPlayer_reset},{setAudioStreamType,IV,voidandroid_media_MediaPlayer_setAudioStreamType},{setLooping,ZV,voidandroid_media_MediaPlayer_setLooping},{setVolume,FFV,voidandroid_media_MediaPlayer_setVolume},{getFrameAt,ILandroid/graphics/Bitmap,voidandroid_media_MediaPlayer_getFrameAt},{native_setup,Ljava/lang/ObjectV,voidandroid_media_MediaPlayer_native_setup},{native_finalize,V,voidandroid_media_MediaPlayer_native_finalize},}staticintregister_android_media_MediaPlayerJNIEnvenv{returnAndroidRuntimeregisterNativeMethodsenv,android/media/MediaPlayer,gMethods,NELEMgMethods}.//jintJNI_OnLoadJavaVMvm,voidreserved{ifregister_android_media_MediaPlayerenv对照表,在程序执行时,可多次呼叫registerNativeMethods函数来更换本地函数之指针,而达到弹性抽换本地函数之目的。

注意事项

本文(23JNI与Android VM之关系.doc)为本站会员(baixue100)主动上传,人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知人人文库网([email protected]),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。

copyright@ 2015-2017 人人文库网网站版权所有
苏ICP备12009002号-5