总之,只有当你必须在同一进程中调用本地代码时,再使用 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)在运行时被加载。
评论1
最新资源