博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一部分,介绍和指南(Part One: Introduction and Tutorial)
阅读量:4029 次
发布时间:2019-05-24

本文共 5476 字,大约阅读时间需要 18 分钟。

原文链接:

第一部分,介绍和指南(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"可能不支持应用需要的某个依赖主机的特性。例如:一个应用程序可能需要执行特别的文件操作,但Java API不支持。然而通过另一个进程来操作文件是繁琐和低效的。
.你可能需要访问一个存在的本地库,不愿意花费在不同进程间的数据的拷贝和复制的开销。在同一个进程中载入本地库是更有效率的。
.横跨多个进程的应用程序可能导致不可接受的内存占用。如果这些进程需要驻留在同一个客户端机器上,这是真确的。载入一个本地库到存在本机进程中,应用程序需要比启动一个新的进程并载入这个库到新进程中需要的更少的系统资源。
.你可能需要在一个低级语言中执行一小段时间要求严格的代码(实时反应的代码)(time-critical code),例如汇编。如果一个"3D"增强应用程序消耗大量的时间在图形绘制中,你可以发现必须用汇编代码写图形库的核心部分来达到最好性能。

 

总之,如果你的Java应用程序必须和驻留在一个进程中的本地代码互操作,就得用"JNI".

 

1.5 Evolution of the JNI(JNI的演化)

从"Java"平台的很早的时候,对于"Java"应用程序对和本地代码互操作的需要的就被认识。"Java"平台的第一版本,"JDK(Java Development Kit) release 1.0", 就包含一个本地方法接口。它允许Java应用程序调用其他语言如"C"和"C++"编写的函数。许多第三方的应用程序和Java类库的实现(例如,包扩java.lang,java.io and java.net),都依赖本地方法接口来访问在底层主机环境中的特性。

 

不幸的是,在"JDK release 1.0"中的本地方法接口发现两个主要的问题:

.首先,本地代码,用C结构体的成员作为对象,来访问域。然而,Java虚拟机规范没有定义对象在内存中怎样布置。如果一个Java虚拟机的实现以一种方法布局这些对象,不同于本地方法接口的设定方法,你必须重编译本地方法库。
.其次,在"JDK release 1.0"中本地方法的接口依赖于一个保守的垃圾收集器,因为本地方法在虚拟机中得到对象的直接指针。任何使用更先进的垃圾收集算法的虚拟机的实现,不可能支持在"JDK release 1.0"中的本地方法接口。

 

设计"JNI"来克服这些问题。一个接口能被在不同主机环境中的所有的Java虚拟机的实现支持。有"JNI":

.每个虚拟机的实现者能支持很大体积的本地代码。
.开发工具商不必处理不同种类的本地接口。
.最重要的,应用程序编程者可以写一个版本的本地代码,这个版本将能在不同的Java虚拟机实现上运行。

"JNI"首先在"JDK release 1.1"中被支持。然而, "JDK release 1.1"内在仍然使用老风格的本地方法(和在"JDK release 1.0"中一样)来执行"Java APIs".在"Java 2 SDK release 1.2"中不再是这样(以前被称为"JDK release 1.2").本地方法被重写, 为了确定"JNI"标准。

 

"JNI"是被所有Java虚拟机实现支持的本机接口。从"JDK release 1.1"开始,你应该用"JNI"编程。老风格本地方法接口仍然在"Java 2 SDK release 1.2"中被支持,但将在未来高级的Java虚拟机实现中不被支持。

 

"Java 2 SDK relase 1.2"包含了大量的JNI增强性能。这个增强是向后兼容的。"JNI"的将来的演化将兼容保留所有的二进制。

 

1.6 Example Programs(例子程序)

这本书包含大量例子程序,它们来证明"JNI"特性。典型的例子吃呢供需包含多段用"Java"编程语言和"C"或"C++"本地编程语言编写的代码片段。有时本地编码参考了在Solaris和Win32系统中的本机特定特性。我们也显示了怎样使用JDK和Java 2SDK release带有的命令行工具(例如"javah")来建立"JNI"程序。

 

记住"JNI"的使用被限制在指定的主机环境或指定的应用开发工具中。这本书关心的是写代码,不是在使用工具编译和运行编码上。和"JDK"和"Java 2 SDK release"捆绑的命令行工具是很原始的。第三方的工具可以提供改善的方法编译使用JNI的应用程序。我们鼓励你参考和你选择的开发工具绑定的"JNI"相关的文档。

 

你能下载这本书中例子的源代码,和这本书的最新更新,来自下面web地址:

<<<>>>

转载地址:http://eimbi.baihongyu.com/

你可能感兴趣的文章
postman调试webservice接口
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
Android DataBinding使用2-Recycleview
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
关于activity保存页面状态的两个方法
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
关于let{a}=B出现的解构赋值
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
android给文字加边框(修改不能居中的问题)
查看>>
coursesa课程 Python 3 programming course_2_assessment_1
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>