没有合适的资源?快使用搜索试试~ 我知道了~
首页Java本地接口(JNI)编程指南和规范
Java本地接口(JNI)编程指南和规范

Java本地接口(JNI)编程指南和规范文档,是The Java Native Interface Programmer's Guide and Specification.pdf的中文版。JNI学习的必备手册。
资源详情
资源评论
资源推荐

Java 本地接口(JNI)编程指南和规范
(The Java Native Interface
Programmer's Guide and Specification)
序言
这本书涉及了"Java"本地接口(JNI)。如果你对下列情况感兴趣,这本书将对你有用:
.整合带有例如"C"或 C++"语言编写的传统代码的 Java 应用程序。
.用例如"C"或 C++"语言编写的已存在的程序来实现 Java 虚拟机。
.实现一个 Java 虚拟机(Java virtual machine)
.理解在语言互操作性上的技术说明,特别是怎样处理例如垃圾收集和多线程的特性。
首先,这本书是为开发者写的。在"JNI"各种特性上的丰富的各种讨论,和在怎样有效的使用"JNI"
的有帮助的提示后,你将能发现很容易按部就班的开始使用"JNI"。"JNI"在 1997 年初初始发布。
这本书总结了,在"Sun"微系统(Sun Microsystem)上工程师和还有在技术交流社区中大量的开发
者,获得的两年经验。
第二,这本书体现了各种"JNI"特性的设计基本原理。不仅学术界感兴趣这个,而且十分透彻的
实际理解也是高效使用 JNI 的先决条件。
第三,这个书的一部分是为"Java 2"平台的"JNI"定义规范。JNI 编程可以使用这个规范当作参考
说明书。Java 虚拟机的实现必须按照规范来一致实现。
关于这个规范的评论或关于"JNI"的问题请发送到我们的地址邮件:jni@java.sun.com。为了最新
的"Java 2"平台,或最新的"Java 2 SDK release"。请访问我们的网站<<<http://java.sun.com>>>。为
关于"Java Series"的更新信息包括这本的勘误表和将要出版书的预览,请访问
<<<http://java.sun.com/Series>>>。
"JNI"的设计引来了在"Sun Microsystems"和 Java 技术授权之间的一些列争论。"JNI"是来自
"Netscape"的 JRI(Java Runtime Interface)的部分进化而来,"JNI"是"Warren Harris"设计的。来自
Java 技术授权公司的许多人积极地参与了设计的讨论。他们包括 Russ Arun(Microsoft), Patrick

Beard(Apple),Simon Nash(IBM),Ken Root(Intel),Ian Ellision-Taylor(Microsoft), and Mike
Toutoghi(Microsoft)。
"JNI"的设计也大量地得益于 Sun 内部设计评论,这评论来自 Dave Bowen, James Gosling, Peter
Kessler, Tim Lindholm, Mark Reinhold, Derek White and Frank Yellin。Dave Brown, Dave Connelly,
James McIlree, Benjamin Renaud, andTom Rodrigues 对"JNI"在"Java 2 SDK 1.2"上的增强做出了
有意义的贡献。在俄罗斯新西伯利亚(Novosibirsk)的兼容性测试的 Carla Schroer 的团队为"JNI"
写了兼容性测试程序。在这过程中,他们发现了原始规范不清楚或不完整的地方。
"JNI"技术没有 Dave Bowen, Larry Abrahams, Dick Neiss, Jon Kannegaard,and Alan Baraz 的管理支
持将不能被开发和部署。我得到来自我的经理 Dave Bowen 的强有力地支持和鼓励来写这本书。
Tim Lindholm,《 The Java Virtual Machine Specification》的作者,在"JNI"被设计时,正主导 Java
虚拟机开发。Tim 在虚拟机和本机接口上做了引领性的工作,提倡"JNI"的使用和为这书增加了
严密性和清晰度。为这本书的封面的厨房和餐厅的艺术设计,他也提供初始的草图。
这本书得益于许多同事的帮助。Anand Palaniswamy 写了第十章关于一般陷阱和缺陷(on common
traps and pitfalls)的部分。Janet Keonig 细心地预读初始的草稿和贡献了许多哦有用的意见。Beth
Stearns 根据在线的 JNI 指南写了第二章的草稿。
我从 Craig J.Bordelon, Michael Brundage, Mary Dageforde, Joshua Engel and Elliott Hughes 处得到
关于这本书草稿有价值的评论。
Lisa Friendly, The Java Series 的编者,有助于这本书的编写和出版。Ken Arnold, The Java
Programming Language 得到作者,首先提出了 JNI 书的编写。我要感谢在整个过程中 Mike
hedrikson 和 Marina Lang 给的帮助和耐心在 Addison-Wesley 出版社。Diance 监督了生产流程从
复制,编辑和最后的打印。
在过去的几年里,我和一群在 Sun Micorsystems 上的 Java 软件中有才能和奉献的人一起,有特
权的工作,特别是 original,HotSpot and Sun Labs 虚拟机团队成员。这本书献给他们。

第一部分,介绍和指南(Part One:
Introduction and Tutorial)
第一章 介绍
"JNI"是"Java"平台的一个强大的功能。使用"JNI"的应用程序能能混合用例如"C"和"C++"语言编
写的本地代码(native code),和用 Java 编程语言编写的代码。"JNI"允许编程人员,在不丢弃在
传统编码上的投入,来利用 Java 平台功能。因为"JNI"是"Java"平台的一部分,编程人员立马解决
互操作的问题,同时解决和 Java 平台的所有的实现一起工作的问题。
这本书是"JNI"的编程指导和参考说明。书包含三个部分:
.第二章通过简单的例子,介绍"JNI"。这个说明,是给不熟悉"JNI"的初始使用者的。
.第三章到第十章构建了编程者的指南,这给出了大量 JNI 功能的全面介绍。我们通过一系列短
而详细描述的例子来展示"JNI"不同的功能,和展示被证明在"JNI"编程中有用的技术。
.第十一章到第十三章为所有的 JNI 类型和函数,展示明确的规范。这些章也被组织为参考说明
服务。
这本书尝试吸引广泛的用户,他们对 JNI 不同需求的。这指南和编程引导是为初始编程者,但
有经验的开发者和 JNI 的实现者可以找到更有用的参考章节在这指南和编程引导中。大多数读
者将可能是开发者,他们用"JNI"来写应用程序。这本书的"你"术语将暗指用"JNI"编程的开发者
(program with the JNI)。相反是"JNI"实现者(JNI implementors)或使用"JNI"写的应用程序的终端用
户。
这本书假设你有"Java,C 和 C++"编程语言的基本知识。如果没有,你可以参考许多有用的优秀
的书本:Ken Arnold and James Gosling(Addison-Wesley,1998)写的"The Java Programming
Language, Second Edittion", Brian Kernighan and Dennis Ritchie(Prentice Hall,1988)写的"The C
Programming Language, Second Edition"和 Bjarne Stroustrup(Addison-Wesley 1997)写的"The C++
Programming Language, Third Edition".
这章剩余的部分介绍 JNI 的背景,作用和演化。
1.1 The Java Platform and Host Environment(Java 平台和主
机环境)
这本书时间用 Java 编程语言和用本地编程语言(C,C++等(etc.))来写应用程序.让我们先为这些语
言,明确正确的编程环境区域。

"Java"平台的编程环境包含"Java"虚拟机(VM)和 Java 应用程序编程的接口(Java Application
Programming Interface(API))。"Java"应用程序是用"Java"编程语言编写的,被编译成一个独立于
机器(machine-independent)二进制类格式.一个类在任何 Java 虚拟机上执行实现。Java 的 API 包
含预定义的类集合。Java"平台的任何实现被假设支持 Java 编程语言,虚拟机和"API"。
主机环境(host environment)术语代表主机操作系统,本地库组,和 CPU 指令集。用本地变成语
言(native programming languages)如"C"和"C++"编写本地应用程序(Native application),被编译特
定主机的二进制编码,和被连接到本地库。本地应用程序和本地库是典型依赖于特定主机环境。
为一个操作系统建立的一个"C"应用程序,例如,典型不能呢工作在另一操作系统上。
"Java"平台被一般的配置在主机环境的上面。例如,"JRE"(Java Runtime Enviroment)是"Sun"产品,
它支持"Java"平台运行在例如"Solaris"和"Windows"的存在操作系统上。"Java"平台提供一组特
性,应用程序能依赖独立于底下的主机环境。
1.2 Role of the JNI(JNI 的作用)
当"Java"平台被配置在主机环境的顶层上,平台对于允许"Java"应用程序,带有用其他语言编写
地本机编码工作,是需要或必须的。编程者已经开始采用 Java 平台来建立用"C"和"C++"编写的
传统的应用程序。因为在遗留代码上存在投资价值,然而,"Java"应用程序将和"C"和"C++"代
码共存许多年。
JNI 的一个强大的特性是允许你来利用"Java"平台,但利用的代码仍然用其他语言来编写。作为
"Java"虚拟机(Jave virtual machine)执行的一部分,"JNI"是一个双向接口,允许 Java 应用程序调
用本地代码,反之亦然(vice versa)。Figure 1.1(图 1.1)说明"JNI"的作用。
Java application <-> Java virtual machine (JNI) <-> Native application
and library implementation and library
| |
|-> Host enviroment <----|
Figure 1.1 Role of JNI
"JNI"被设计为处理你需要联合"Java"应用程序和本地代码的情况。做为一个双向接口,"JNI"能
支持两种本地编码:本地库(native libraries)和本地应用程序(native application)。
.你能使用"JNI"来编写,允许 Java 应用程序来调用在本地库中实现的函数的本地方法(native
method)。"Java"应用程序,通过和他们调用在 Java 编程语言中实现的方法一样办法,调用本地
方法。然而幕后,本地方法是用另一种语言实现的和位于本地库中。
."JNI"支持一个调用接口(invocation interface),这个接口允许你嵌入一个 Java 虚拟机执行到你本

地应用程序中。本地应用程序能和执行 Java 虚拟机的本地库链接,同样因此用调用接口来执行
用 Java 编程语言编写的软件控件。例如,一个用"C"写的"web"浏览器能在嵌入式 Java 虚拟机执
行中执行下载"applets"。
1.3 Implications of Using the JNI(使用 JNI 的影响)
记住一旦一个应用程序使用了 JNI,它冒险失去了 Java 平台的两个好处。
首先,依赖"JNI"的"Java"应用程序不再可以在多种主机环境中运行。即使用 Java 编程语言编写的
应程序的部分可移植到多种主机环境,它将需要重新编译用本地编程语言编写的应用程序的部
分。
其次,Java 编程语言的类型安全和可靠,然而本地语言例如"C"或"C++"是没有的。因此,当你
用 JNI 来写应用程序时你必须额外地细心。一个有恶意的本地方法可能破坏整个应用程序。因
为这个原因,Java 应用程序在调用 JNI 特性前,接受了安全检查。
作为一般规则,你应该构建应用程序时,在尽量少的类中定义本地方法。这就意味着在本地代
码和应用程序剩余代码之间有一个明显的隔离。
1.4 When to Use the JNI(什么时间使用 JNI)
在你从事一个使用"JNI"的工程前,后退一步调查一下是不是有根合理的替代方案是值得的。像
上一章提到的,当和严格用"Java"编程语言写的应用程序比时,使用"JNI"的应用程序有固有的
缺点。例如,你失去 Java 编程语言的类型安全保证。
大量的可选方案也允许"Java"应用程序和其他语言编写的代码互操作的。例如:
."Java"应用程序通过一个"TCP/IP"链接和其他进程间通信机制(other inter-process communication
(IPC) mechanisms)来和本地应用程序交流。
.一个"Java"应用程序可以通过"JDBC API"连接到原来的数据库上。
.一个"Java"应用程序可以利用分布式对象技术例如"Java IDL API"
这些替代方案的一般特征是"Java"应用程序和本地代码放在不同的进程中(在一些案例中在不同
的机器上).进程隔离提供了一个重要的好处。进程提供了地址空间的保护能够最大限度的错误隔
离,一个奔溃的本地应用程序不会立马终止通过"TCP/IP"和它通讯的"Java"应用程序。
然而有时,你可以发现对于"Java"应用程序必须和驻留在一样进程中(resides in the same process)
的本地代码交流。这是"JNI"很有用的时候。思考,例如,下面的情况:
."Java API"可能不支持应用需要的某个依赖主机的特性。例如:一个应用程序可能需要执行特别
剩余140页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论12