Andrid中怎样嵌入C语言(一).docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Andrid中怎样嵌入C语言(一)

首页Android开发者社区Android百科极客学院开启辅助访问打卡签到我要上头条如何赚e币注册验证问题版主申请切换到宽版窗体顶端用户名自动登录?找回密码密码登录?免费加入只需一步,快速开始窗体底端快捷导航首页社区新手入门技术问答实例教程资源下载游戏开发Android源码招聘学习路线图窗体顶端帖子搜索热搜:二维码定时器手电筒滑块斗地主书架定位买手机聊天游戏开发游戏股票查询机顶盒通话记录二维码扫描振动器listviewfragment音乐播放器播放器窗体底端eoe 移动开发者论坛?社区?Android开发交流?Framework底层开发?Android中怎样嵌入C语言(一)返回列表查看:?3764|回复:?6??Android中怎样嵌入C语言(一)?[复制链接]feige67主题228帖子426e币发消息电梯直达楼主?发表于 2011-7-28 14:09:31?|?只看该作者?没有eoe的账号,级别还太低,出门如何吹牛逼?您需要?登录?才可以下载或查看,没有帐号?免费加入?x本帖最后由 feige 于 2011-8-1 13:52 编辑? ?? ??Android JNI知识简介? ?? ? Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。? ?? ??1.从如何载入.so档案谈起? ?? ???由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM: Virtual Machine)来执行。VM在Android平台里,扮演很重要的角色。? ?? ? 此外,在执行Java类的过程中,如果Java类需要与C组件沟通时,VM就会去载入C组件,然后让Java的函数顺利地调用到C组件的函数。此时,VM扮演着桥梁的角色,让Java与C组件能通过标准的JNI介面而相互沟通。? ??? ?? ? 应用层的Java类是在虚拟机(VM: Vitual Machine)上执行的,而C件不是在VM上执行,那么Java程式又如何要求VM去载入(Load)所指定的C组件呢? 可使用下述指令:? ?? ? System.loadLibrary(*.so的档案名);?? ?? ? 例如,Android框架里所提供的MediaPlayer.java类,含指令:java代码:public class MediaPlayer{?static {System.loadLibrary(media_jni);}}复制代码? ?? ? 这要求VM去载入Android的/system/lib/libmedia_jni.so档案。载入*.so之后,Java类与*.so档案就汇合起来,一起执行了。? ?? ???2.如何撰写*.so的入口函数? ?? ???JNI_OnLoad()与JNI_OnUnload()函数的用途? ?? ???当Android的VM(Virtual Machine)执行到System.loadLibrary()函数时,首先会去执行C组件里的JNI_OnLoad()函数。它的用途有二:? ?? ???(1)告诉VM此C组件使用那一个JNI版本。如果你的*.so档没有提供JNI_OnLoad()函数,VM会默认该*.so档是使用最老的JNI 1.1版本。由于新版的JNI做了许多扩充,如果需要使用JNI的新版功能,例如JNI 1.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()函数,其程式码片段为:java代码://#define LOG_NDEBUG 0#define LOG_TAG MediaPlayer-JNIjint JNI_OnLoad(JavaVM* vm, void* reserved){JNIEnv* env = NULL;jint result = -1;if (vm-GetEnv((void**) env, JNI_VERSION_1_4) != JNI_OK) {LOGE(ERROR: GetEnv

文档评论(0)

hfenxchuangjv + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档