Board logo

标题: Java JNI深度分析与实践 [打印本页]

作者: qingqing3721    时间: 2011-9-1 07:56     标题: Java JNI深度分析与实践

Java 环境和语言对于运用顺序开发来说是十分平安和高效的。但是,一些运用顺序却需要执行纯 Java 顺序无法完成的一些任务,比如:
  与旧有代码集成,防止重新编写。
  实现可用类库中所缺少的功用。举例来说,在 Java 语言中实现ping 时,您可能需要 Internet Control Message Protocol (ICMP) 功用,但基本类库并未提供它。
  最好与运用C/C++ 编写的代码集成,以充沛开掘性能或其他与环境相关的零碎特性。
  处置需要非Java 代码的特殊情况。举例来说,中心类库的实现可能需要跨包调用或者需要绕过其他 Java 平安性反省。
  JNI 允许您完成这些任务。它明确分开了 Java 代码与本机代码(C/C++)的执行,定义了一个清晰的 API 在这两者之间进行通讯。从很大水平上说,它防止了本机代码对 JVM 的直接内存引用,从而确保本机代码只需编写一次,并且可以跨不同的 JVM 实现或版本运转。
  借助 JNI,本机代码可以随意与 Java 对象交互,获取和设计字段值,以及调用方法,而不会像 Java 代码中的相同功用那样受到诸多限制。这种自在是一把双刃剑:它牺牲 Java 代码的平安性,换取了完成上述所列任务的才干。在您的运用顺序中运用 JNI 提供了强大的、对机器资源(内存、I/O 等)的低级访问,因此您不会像普通 Java 开发人员那样受到平安网的保护。JNI 的灵活性和强大性带来了一些编程理论上的风险,比如导致性能较差、呈现 bug 甚至顺序崩溃。您必须格外留意运用顺序中的代码,并运用良好的理论来保障运用顺序的总体完整性。
  本文介绍JNI 用户最常遇到的10 大编码和设计错误。其目的是帮助您认识到并防止它们,以便您可以编写平安、高效、性能出众的JNI 代码。本文还将介绍一些用于在新代码或已有代码中查找这些成果的工具和技巧,并展现如何有效地运用它们。
  Java JNI 编程缺陷可以分为两类:
  性能:代码能执行所设计的功用,但运转迟缓或者以某种形式拖慢整个顺序。
  正确性:代码有时能正常运转,但不能牢靠地提供所需的功用;最坏的情况是造成顺序崩溃或挂起。
  性能缺陷
  顺序员在运用 JNI 时的 5 大性能缺陷如下:
  不缓存方法 ID、字段 ID 和类
  触发数组副本
  回访(Reaching back)而不是传递参数
  错误认定本机代码与 Java 代码之间的界限
  运用少量本地引用,淘宝网安踏而未通知 JVM
  不缓存方法 ID、字段 ID 和类
  要访问 Java 对象的字段并调用它们的方法,本机代码必须调用 FindClass()、GetFieldID()、GetMethodId() 和 GetStaticMethodID()。对于 GetFieldID()、GetMethodID() 和 GetStaticMethodID(),为特定类返回的 ID 不会在 JVM 进程的生活期内发生变化。但是,获取字段或方法的调用有时会需要在 JVM 中完成少量任务,因为字段和方法可能是从超类中承袭而来的,这会让 JVM 向上遍历类层次结构来找到它们。由于 ID 对于特定类是相同的,因此您只需要查找一次,然后便可重复运用。异样,查找类对象的开支也很大,因此也应该缓存它们。




欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/) Powered by Discuz! 6.0.0