20认识so里的JNI_OnLoad()函数.doc20认识so里的JNI_OnLoad()函数.doc

收藏 分享

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

20认识SO里的JNI_ONLOAD函数当ANDROID的VMVIRTUALMACHINE执行到C组件即SO文件里的SYSTEMLOADLIBRARY函数时,首先会去执行C组件里的JNI_ONLOAD函数。它的用途有二1告诉VM此C组件使用那一个JNI版本。如果你的SO文件没有提供JNI_ONLOAD函数,VM会默认该SO檔是使用最老的JNI11版本。由于新版的JNI做了许多扩充,如果需要使用JNI的新版功能,例如JNI14的JAVANIOBYTEBUFFER,就必须藉由JNI_ONLOAD函数来告知VM。2由于VM执行到SYSTEMLOADLIBRARY函数时,就会立即先呼叫JNI_ONLOAD,所以C组件的开发者可以藉由JNI_ONLOAD来进行C组件内的初期值之设定INITIALIZATION。例如,在ANDROID的/SYSTEM/LIB/LIBMEDIA_JNISO档案里,就提供了JNI_ONLOAD函数,其程序代码片段为//DEFINELOG_NDEBUG0DEFINELOG_TAGMEDIAPLAYERJNIJINTJNI_ONLOADJAVAVMVM,VOIDRESERVED{JNIENVENVNULL;JINTRESULT1;IFVMGETENVVOIDENV,JNI_VERSION_1_4JNI_OK{LOGEERRORGETENVFAILED\N;GOTOBAIL;}ASSERTENVNULL;IFREGISTER_ANDROID_MEDIA_MEDIAPLAYERENV0{LOGEERRORMEDIAPLAYERNATIVEREGISTRATIONFAILED\N;GOTOBAIL;}IFREGISTER_ANDROID_MEDIA_MEDIARECORDERENV0{LOGEERRORMEDIARECORDERNATIVEREGISTRATIONFAILED\N;GOTOBAIL;}IFREGISTER_ANDROID_MEDIA_MEDIASCANNERENV0{LOGEERRORMEDIASCANNERNATIVEREGISTRATIONFAILED\N;GOTOBAIL;}IFREGISTER_ANDROID_MEDIA_MEDIAMETADATARETRIEVERENV0{LOGEERRORMEDIAMETADATARETRIEVERNATIVEREGISTRATIONFAILED\N;GOTOBAIL;}/SUCCESSRETURNVALIDVERSIONNUMBER/RESULTJNI_VERSION_1_4;BAILRETURNRESULT;}//KTHXBYE此函数回传JNI_VERSION_1_4值给VM,于是VM知道了其所使用的JNI版本了。此外,它也做了一些初期的动作可呼叫任何本地函数,例如指令IFREGISTER_ANDROID_MEDIA_MEDIAPLAYERENV0{LOGEERRORMEDIAPLAYERNATIVEREGISTRATIONFAILED\N;GOTOBAIL;}就将此组件提供的各个本地函数NATIVEFUNCTION登记到VM里,以便能加快后续呼叫本地函数之效率。JNI_ONUNLOAD函数与JNI_ONLOAD相对应的。在加载C组件时会立即呼叫JNI_ONLOAD来进行组件内的初期动作;而当VM释放该C组件时,则会呼叫JNI_ONUNLOAD函数来进行善后清除动作。当VM呼叫JNI_ONLOAD或JNI_UNLOAD函数时,都会将VM的指标POINTER传递给它们,其参数如下JINTJNI_ONLOADJAVAVMVM,VOIDRESERVED{}JINTJNI_ONUNLOADJAVAVMVM,VOIDRESERVED{}在JNI_ONLOAD函数里,就透过VM之指标而取得JNIENV之指标值,并存入ENV指针变量里,如下述指令JINTJNI_ONLOADJAVAVMVM,VOIDRESERVED{JNIENVENVNULL;JINTRESULT1;IFVMGETENVVOIDENV,JNI_VERSION_1_4JNI_OK{LOGEERRORGETENVFAILED\N;GOTOBAIL;}由于VM通常是多执行绪MULTITHREADING的执行环境。每一个执行绪在呼叫JNI_ONLOAD时,所传递进来的JNIENV指标值都是不同的。为了配合这种多执行绪的环境,C组件开发者在撰写本地函数时,可藉由JNIENV指标值之不同而避免执行绪的数据冲突问题,才能确保所写的本地函数能安全地在ANDROID的多执行绪VM里安全地执行。基于这个理由,当在呼叫C组件的函数时,都会将JNIENV指标值传递给它,如下JINTJNI_ONLOADJAVAVMVM,VOIDRESERVED{JNIENVENVNULL;IFREGISTER_ANDROID_MEDIA_MEDIAPLAYERENV0{}}这JNI_ONLOAD呼叫REGISTER_ANDROID_MEDIA_MEDIAPLAYERENV函数时,就将ENV指标值传递过去。如此,在REGISTER_ANDROID_MEDIA_MEDIAPLAYER函数就能藉由该指标值而区别不同的执行绪,以便化解数据冲突的问题。例如,在REGISTER_ANDROID_MEDIA_MEDIAPLAYER函数里,可撰写下述指令IFENVMONITORENTERENV,OBJJNI_OK{}查看是否已经有其它执行绪进入此对象,如果没有,此执行绪就进入该对象里执行了。还有,也可撰写下述指令IFENVMONITOREXITENV,OBJJNI_OK{}查看是否此执行绪正在此对象内执行,如果是,此执行绪就会立即离开。
编号:201312142342507828    类型:共享资源    大小:41.00KB    格式:DOC    上传时间:2013-12-14
  
3
关 键 词:
IS 电气 高压 110kv 220kv 550kv 800kv
  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:20认识so里的JNI_OnLoad()函数.doc
链接地址:http://www.renrendoc.com/p-217828.html

当前资源信息

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

官方联系方式

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

精品推荐

相关阅读

人人文库
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服客服 - 联系我们

网站客服QQ:2846424093    人人文库上传用户QQ群:460291265   

[email protected] 2016-2018  renrendoc.com 网站版权所有   南天在线技术支持

经营许可证编号:苏ICP备12009002号-5