使用 java native interface 的最佳实践

使用 java native interface 的最佳实践

ID:36242253

大小:49.52 KB

页数:17页

时间:2019-05-07

使用 java native interface 的最佳实践_第1页
使用 java native interface 的最佳实践_第2页
使用 java native interface 的最佳实践_第3页
使用 java native interface 的最佳实践_第4页
使用 java native interface 的最佳实践_第5页
资源描述:

《使用 java native interface 的最佳实践》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、使用JavaNativeInterface的最佳实践避免最常见的10大JNI编程错误的技巧和工具Java™本机接口(JavaNativeInterface,JNI)是一个标准的JavaAPI,它支持将Java代码与使用其他编程语言编写的代码相集成。如果您希望利用已有的代码资源,那么可以使用JNI作为您工具包中的关键组件——比如在面向服务架构(SOA)和基于云的系统中。但是,如果在使用时未注意某些事项,则JNI会迅速导致应用程序性能低下且不稳定。本文将确定10大JNI编程缺陷,提供避免这些缺陷的最佳实践,并介绍可用于实现这些实践的工具。Java环境和语言对于应用程序

2、开发来说是非常安全和高效的。但是,一些应用程序却需要执行纯Java程序无法完成的一些任务,比如:JNI的发展JNI自从JDK1.1发行版以来一直是Java平台的一部分,并且在JDK1.2发行版中得到了扩展。JDK1.0发行版包含一个早期的本机方法接口,但是未明确分隔本机代码和Java代码。在这个接口中,本机代码可以直接进入JVM结构,因此无法跨JVM实现、平台或者甚至各种JDK版本进行移植。使用JDK1.0模型升级含有大量本机代码的应用程序,以及开发能支持多个JVM实现的本机代码的开销是极高的。JDK1.1中引入的JNI支持:版本独立性平台独立性VM独立性开发第三

3、方类库有一个有趣的地方值得注意,一些较年轻的语言(如PHP)在它们的本机代码支持方面仍然在努力克服这些问题。与旧有代码集成,避免重新编写。实现可用类库中所缺少的功能。举例来说,在Java语言中实现ping时,您可能需要InternetControlMessageProtocol(ICMP)功能,但基本类库并未提供它。最好与使用C/C++编写的代码集成,以充分发掘性能或其他与环境相关的系统特性。解决需要非Java代码的特殊情况。举例来说,核心类库的实现可能需要跨包调用或者需要绕过其他Java安全性检查。JNI允许您完成这些任务。它明确分开了Java代码与本机代码(C

4、/C++)的执行,定义了一个清晰的API在这两者之间进行通信。从很大程度上说,它避免了本机代码对JVM的直接内存引用,从而确保本机代码只需编写一次,并且可以跨不同的JVM实现或版本运行。借助JNI,本机代码可以随意与Java对象交互,获取和设置字段值,以及调用方法,而不会像Java代码中的相同功能那样受到诸多限制。这种自由是一把双刃剑:它牺牲Java代码的安全性,换取了完成上述所列任务的能力。在您的应用程序中使用JNI提供了强大的、对机器资源(内存、I/O等)的低级访问,因此您不会像普通Java开发人员那样受到安全网的保护。JNI的灵活性和强大性带来了一些编程实践

5、上的风险,比如导致性能较差、出现bug甚至程序崩溃。您必须格外留意应用程序中的代码,并使用良好的实践来保障应用程序的总体完整性。本文介绍JNI用户最常遇到的10大编码和设计错误。其目标是帮助您认识到并避免它们,以便您可以编写安全、高效、性能出众的JNI代码。本文还将介绍一些用于在新代码或已有代码中查找这些问题的工具和技巧,并展示如何有效地应用它们。JNI编程缺陷可以分为两类:性能:代码能执行所设计的功能,但运行缓慢或者以某种形式拖慢整个程序。正确性:代码有时能正常运行,但不能可靠地提供所需的功能;最坏的情况是造成程序崩溃或挂起。l性能缺陷程序员在使用JNI时的5大

6、性能缺陷如下:1.不缓存方法ID、字段ID和类2.触发数组副本3.回访(Reachingback)而不是传递参数4.错误认定本机代码与Java代码之间的界限5.使用大量本地引用,而未通知JVM不缓存方法ID、字段ID和类要访问Java对象的字段并调用它们的方法,本机代码必须调用FindClass()、GetFieldID()、GetMethodId()和GetStaticMethodID()。对于GetFieldID()、GetMethodID()和GetStaticMethodID(),为特定类返回的ID不会在JVM进程的生存期内发生变化。但是,获取字段或方法的

7、调用有时会需要在JVM中完成大量工作,因为字段和方法可能是从超类中继承而来的,这会让JVM向上遍历类层次结构来找到它们。由于ID对于特定类是相同的,因此您只需要查找一次,然后便可重复使用。同样,查找类对象的开销也很大,因此也应该缓存它们。举例来说,清单1展示了调用静态方法所需的JNI代码:清单1.使用JNI调用静态方法intval=1;jmethodIDmethod;jclasscls;cls=(*env)->FindClass(env,"com/ibm/example/TestClass");if((*env)->ExceptionCheck(env)){ret

8、urnER

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。