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

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

23JNI与Android VM之关系.doc23JNI与Android VM之关系.doc -- 3 元

宽屏显示 收藏 分享

资源预览需要最新版本的Flash Player支持。
您尚未安装或版本过低,建议您

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函数来更换本地函数之指针,而达到弹性抽换本地函数之目的。
编号:201312142343097834    大小:63.00KB    格式:DOC    上传时间:2013-12-14
  【编辑】
3
关 键 词:
IS 电气 高压 110kv 220kv 550kv 800kv
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

当前资源信息

4.0
 
(2人评价)
浏览:13次
baixue100上传于2013-12-14

官方联系方式

客服手机:17625900360   
2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   

相关资源

相关资源

相关搜索

IS   电气   高压   110kv   220kv   550kv   800kv  
关于我们 - 网站声明 - 网站地图 - 友情链接 - 网站客服客服 - 联系我们
copyright@ 2015-2017 人人文库网网站版权所有
苏ICP备12009002号-5