没有合适的资源?快使用搜索试试~ 我知道了~
Java程序中JNI的编程指南

温馨提示


试读
64页
这四种情况下你会用到本书: 1、 在Java程序中复用以前写过的C/C++代码。 2、 自己实现一个java虚拟机 3、 学习不同语言如何进行协作,尤其是如何实现垃圾回收和多线程。 4、 把一个虚拟机实现整合到用C/C++写的程序中。 本书是写给开发者的。JNI在1997年第一次发布,本书总结了SUN工程师和大量开发者两年来积累的经验。 本书介绍了JNI的设计思想,对这种思想的理解是使用JNI的各种特性的基础。 本书有一部分是JAVA2平台上面的JNI特征的规范说明。JNI程序员可以把这部分用作一个手册。JVM开发者在实现虚拟机的时候必须遵守这些规范。 JNI的部分设计思想来源于Netscape的Java Runtime Interface(JRI)。
资源推荐
资源详情
资源评论













序
这四种情况下你会用到本书:
1、 在 Java 程序中复用以前写过的 C/C++代码。
2、 自己实现一个 java 虚拟机
3、 学习不同语言如何进行协作,尤其是如何实现垃圾回收和多线程。
4、 把一个虚拟机实现整合到用 C/C++写的程序中。
本书是写给开发者的。JNI 在 1997 年第一次发布,本书总结了 SUN 工程师和大量开发者两
年来积累的经验。
本书介绍了 JNI 的设计思想,对这种思想的理解是使用 JNI 的各种特性的基础。
本书有一部分是 JAVA2 平台上面的 JNI 特征的规范说明。JNI 程序员可以把这部分用作一
个手册。JVM 开发者在实现虚拟机的时候必须遵守这些规范。
JNI 的部分设计思想来源于 Netscape 的 Java Runtime Interface(JRI)。
第一章 简介
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 指令集。本地程序(Native
Applications)使用 C/C++这样的本地语言来编写,被编译成只能在本地系统环境下运行的
二进制代码,并和本地库链接在一起。本地程序和本地库一般地会依赖于一个特定的本地
系统环境。比如,一个系统下编译出来的 C 程序不能在另一个系统中运行。
1.2 JNI 扮演的角色
JNI 的强大特性使我们在使用 JAVA 平台的同时,还可以重用原来的本地代码。作为虚拟机
实现的一部分,JNI 允许 JAVA 和本地代码间的双向交互。

图
1.1 JNI 的角色
JNI 可以这样与本地程序进行交互:
1、 你可以使用 JNI 来实现“本地方法”(native methods),并在 JAVA 程序中调用它们。
2、 JNI 支持一个“调用接口”(invocation interface),它允许你把一个 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 程序。
第二章 开始。。。
本章通过一个简单的例子来示例如何使用 JNI。我们写一个 JAVA 程序,并用它调用一个 C
函数来打印“Hello World!。
2.1 概述
图 2.1 演示了如何使用 JAVA 程序调用 C 函数来打印“Hello World!。这个过程包含下面几步:
1、 创建一个类(HelloWorld.java)声明本地方法。
2、 使用 javac 编译源文件 HollowWorld.java,产生 HelloWorld.class。使用 javah –jni 来生成
C 头文件(HelloWorld.h),这个头文件里面包含了本地方法的函数原型。
3、 用 C 代码写函数原型的实现。
4、 把 C 函数实现编译成一个本地库,创建 Hello-World.dll 或者 libHello-World.so。
5、 使用 java 命令运行 HelloWorld 程序,类文件 HelloWorld.class 和本地库(HelloWorld.dll
或者 libHelloWorld.so)在运行时被加载。

图
2.1 编写并运行“HelloWorld程序
本章剩余部分会详细解释这几步。
第三章 基本类型、字符串、数组
开发者使用 JNI 时最常问到的是 JAVA 和 C/C++之间如何传递数据,以及数据类型之间如何
互相映射。本章我们从整数等基本类型和数组、字符串等普通的对象类型开始讲述。至于
如何传递任意对象,我们将在下一章中进行讲述。
3.1 一个简单的本地方法
JAVA 端源代码如下:

!"#$%"
$!!"&$%"'
(
$!$""
(
(
3.1.1 本地方法的 C 函数原型
Prompt.getLine 方法可以用下面这个 C 函数来实现:
)*+,-./#0)*+12
)33)*+,450050
其中,JNIEXPORT 和 JNICALL 这两个宏(被定义在 jni.h)确保这个函数在本地库外可见,
并且 C 编译器会进行正确的调用转换。C 函数的名字构成有些讲究,在 11.3 中会有一个详
细的解释。
3.1.2 本地方法参数
第一个参数 JNIEnv 接口指针,指向一个个函数表,函数表中的每一个入口指向一个 JNI 函
数。本地方法经常通过这些函数来访问 JVM 中的数据结构。图 3.1 演示了 JNIEnv 这个指针:
图
3.1
JNIEnv 接口指针
第二个参数根据本地方法是一个静态方法还是实例方法而有所不同。本地方法是一个静态
方法时,第二个参数代表本地方法所在的类;本地方法是一个实例方法时,第二个参数代
表本地方法所在的对象。我们的例子当中,Java_Prompt_getLine 是一个实例方法,因此
jobject 参数指向方法所在的对象。
3.1.3 类型映射
剩余63页未读,继续阅读
资源评论

- 涂作权的博客2012-12-06终于找到这方面的资料了

nemo211
- 粉丝: 1
- 资源: 6
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


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