JNI编程指南-简介

来源:互联网 发布:网页版手机淘宝店铺 编辑:程序博客网 时间:2024/05/16 08:42

第一章   简介

 

JNI是JAVA平台的一个重要特征,使用它我们可以重用以前用C/C++写的大量代码。本书既是一个编程指南也是一个JNI手册。本书共包括三部分:

1、  第二章通过一个简单的例子介绍了JNI。它的对象是对JNI不熟悉的初学者。

2、  3~10章对JNI的特征进行了系统的介绍。我们会举大量的例子来说明JNI的各个特征,这些特征都是JNI中重要且常用的。

3、  11~13章是关于JNI的技术规范。可以把这两章当作一个手册。

本书尽量去满足各类读者的需要。指南面向初学者,手册面向有经验的人和自己实现JNI规范的人。大部分读者可能是用JNI来写程序的开发者。本书会假设你有JAVA,C/C++基础。

本章的剩余部分介绍了JNI的背景,扮演的角色和JNI的演化。

 

1.1 JAVA平台和系统环境(Host Environment)

 

系统环境代指本地操作系统环境,它有自己的本地库和CPU指令集。本地程序(NativeApplications)使用C/C++这样的本地语言来编写,被编译成只能在本地系统环境下运行的二进制代码,并和本地库链接在一起。本地程序和本地库一般地会依赖于一个特定的本地系统环境。比如,一个系统下编译出来的C程序不能在另一个系统中运行。

 

1.2 JNI扮演的角色

 

JNI的强大特性使我们在使用JAVA平台的同时,还可以重用原来的本地代码。作为虚拟机实现的一部分,JNI允许JAVA和本地代码间的双向交互。


图1.1 JNI的角色

JNI可以这样与本地程序进行交互:

1、  你可以使用JNI来实现“本地方法”(native methods),并在JAVA程序中调用它们。

2、  JNI支持一个“调用接口”(invocationinterface),它允许你把一个JVM嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写的软件模块。例如,一个用C语言写的浏览器可以在一个嵌入式JVM上面执行从网上下载下来的applets

 

1.3 JNI的副作用

 

请记住,一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:

1、  程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。

2、  程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。

一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。

 

1.4 什么场合下应该使用JNI

 

当你开始着手准备一个使用JNI的项目时,请确认是否还有替代方案。像上一节所提到的,应用程序使用JNI会带来一些副作用。下面给出几个方案,可以避免使用JNI的时候,达到与本地代码进行交互的效果:

1、  JAVA程序和本地程序使用TCP/IP或者IPC进行交互。

2、  当用JAVA程序连接本地数据库时,使用JDBC提供的API。

3、  JAVA程序可以使用分布式对象技术,如JAVA IDL API。

这些方案的共同点是,JAVA和C 处于不同的线程,或者不同的机器上。这样,当本地程序崩溃时,不会影响到JAVA程序。

下面这些场合中,同一进程内JNI的使用无法避免:

1、  程序当中用到了JAVA  API不提供的特殊系统环境才会有的特征。而跨进程操作又不现实。

2、  你可能想访问一些己有的本地库,但又不想付出跨进程调用时的代价,如效率,内存,数据传递方面。

3、  JAVA程序当中的一部分代码对效率要求非常高,如算法计算,图形渲染等。

总之,只有当你必须在同一进程中调用本地代码时,再使用JNI。

 

1.5 JNI的演化

 

JDK1.0包含了一个本地方法接口,它允许JAVA程序调用C/C++写的程序。许多第三方的程序和JAVA类库,如:java.lang,java.io,java.net等都依赖于本地方法来访问底层系统环境的特征。

不幸的是,JDK1.0中的本地方法有两个主要问题:

1、  本地方法像访问C中的结构(structures)一样访问对象中的字段。尽管如此,JVM规范并没有定义对象怎么样在内存中实现。如果一个给定的JVM实现在布局对象时,和本地方法假设的不一样,那你就不得不重新编写本地方法库。

2、  因为本地方法可以保持对JVM中对象的直接指针,所以,JDK1.0中的本地方法采用了一种保守的GC策略。

JNI的诞生就是为了解决这两个问题,它可以被所有平台下的JVM支持:

1、  每一个VM实现方案可以支持大量的本地代码。

2、  开发工具作者不必处理不同的本地方法接口。

3、  最重要的是,本地代码可以运行在不同的JVM上面。

JDK1.1中第一次支持JNI,但是,JDK1.1仍在使用老风格的本地代码来实现JAVA的API。这种情况在JDK1.2下被彻底改变成符合标准的写法。

 

1.6 例子程序

 

本书包含了大量的代码示例,还教我们如何使用javah来构建JNI程序。

0 0
原创粉丝点击