深入浅出JNI.docVIP

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

深入浅出JNI JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着重要的意义,这儿的内容比较多,也是最基本的,如果想彻底了解JNI的机制,请查看:/javase/1.5.0/docs/guide/jni/spec/design.html 本文结合了网友ljeagle写的JNI学习笔记和自己通过JNI的手册及Android中常用的部分写得本文。 JNI学习笔记: /ljeagle/article/details/6660901 让我们开始吧!! ---------------------------------------------------------------------------------------- JNI概念 JNI是本地语言编程接口。它允许运行在JVM中的Java代码和用C、C++或汇编写的本地代码相互操作。 在以下几种情况下需要使用到JNI: 应用程序依赖于特定平台,平台独立的Java类库代码不能满足需要 你已经有一个其它语言写的一个库,并且这个库需要通过JNI来访问Java代码 需要执行速度要求的代码实现功能,比如低级的汇编代码 通过JNI编程,你可以使用本地方法来: l? 创建、访问、更新Java对象 l? 调用Java方法 l? 捕获及抛出异常 l? 加载并获得类信息 l? 执行运行时类型检查 JNI的原理 JVM将JNI接口指针传递给本地方法,本地方法只能在当前线程中访问该接口指针,不能将接口指针传递给其它线程使用。在VM中 JNI接口指针指向的区域用来分配和存储线程本地数据。 当Java代码调用本地方法时,VM将JNI接口指针作为参数传递给本地方法,当同一个Java线程调用本地方法时VM保证传递给本地方法的参数是相同的。不过,不同的Java线程调用本地方法时,本地方法接收到的JNI接口指针是不同的。 加载和链接本地方法 在Java里通过System.loadLibrary()来加载动态库,但是,动态库只能被加载一次,因此,通常动态库的加载放在静态初始化语句块中。 [cpp] view plaincopyprint? package?pkg;???? class?Cls?{??? ?????native?double?f(int?i,?String?s);??????//?声明为本地方法 ?? ?????static?{??? ?????????System.loadLibrary(“pkg_Cls”);?????//?通过静态初始化语句块来加载动态库 ?? ?????}??? }??? package pkg; class Cls { native double f(int i, String s); // 声明为本地方法 static { System.loadLibrary(“pkg_Cls”); // 通过静态初始化语句块来加载动态库 } } 通常在动态库中声明大量的函数,这些函数被Java调用,这些本地函数由VM维护在一张函数指针数组中,在本地方法里通过调用JNI方法RegisterNatives()来注册本地方法和Java方法的映射关系。 本地方法可以由C或C++来实现,C语言版本: [cpp] view plaincopyprint? jdouble?native_fun?(??? ?????JNIEnv?*env,???????????/*?interface?pointer?*/??? ?????jobject?obj,???????????/*?this?pointer?*/??? ?????jint?i,????????????????/*?argument?#1?*/??? ?????jstring?s)?????????????/*?argument?#2?*/??? {??? ?????/*?Obtain?a?C-copy?of?the?Java?string?*/??? ?????const?char?*str?=?(*env)-GetStringUTFChars(env,?s,?0);??? ?? ?????/*?process?the?string?*/??? ?????...??? ?? ?????/*?Now?we?are?done?with?str?*/??? ?????(*env)-ReleaseStringUTFChars(env,?s,?str);??? ?????return?...??? }??? jdouble n

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档