A.1 Java 固有接口
JNI 是一种包容极广的编程接口,允许我们从 Java 应用程序里调用固有方法。它是在 Java 1.1
里新增的,维持着与 Java 1.0 的相应特性——“固有方法接口”(NMI)——某种程度的兼
容。NMI 设计上一些特点使其未获所有虚拟机的支持。考虑到这个原因,Java 语言将来的
版本可能不再提供对 NMI 的支持,这儿也不准备讨论它。
目前,JNI 只能与用 C 或 C++写成的固有方法打交道。利用 JNI,我们的固有方法可以:
■创建、检查及更新 Java 对象(包括数组和字串)
■调用 Java 方法
■俘获和丢弃“异常”
■装载类并获取类信息
■进行运行期类型检查
所以,原来在 Java 中能对类及对象做的几乎所有事情在固有方法中同样可以做到。
A.1.1 调用固有方法
我们先从一个简单的例子开始:一个 Java 程序调用固有方法,后者再调用 Win32 的 API 函
数 MessageBox(),显示出一个图形化的文本框。这个例子稍后也会与 J/Direct 一志使用。若
您的平台不是 Win32,只需将包含了下述内容的 C 头:
#include <windows.h>
替换成:
#include <stdio.h>
并将对 MessageBox()的调用换成调用 printf()即可。
第一步是写出对固有方法及它的自变量进行声明的 Java 代码:
999 页程序
在固有方法声明的后面,跟随有一个 static 代码块,它会调用 System.loadLibrary()(可在任
何时候调用它,但这样做更恰当)System.loadLibrary()将一个 DLL 载入内存,并建立同它的
链接。DLL 必须位于您的系统路径,或者在包含了 Java 类文件的目录中。根据具体的平台,
JVM 会自动添加适当的文件扩展名。
1. C 头文件生成器:javah
现在编译您的 Java 源文件,并对编译出来的.class 文件运行 javah。javah 是在 1.0 版里提供
的,但由于我们要使用 Java 1.1 JNI,所以必须指定-jni 参数:
javah -jni ShowMsgBox
javah 会读入类文件,并为每个固有方法声明在 C 或 C++头文件里生成一个函数原型。下面
是输出结果——ShowMsgBox.h 源文件(为符合本书的要求,稍微进行了一下修改):
1000 页程序
从“#ifdef_cplusplus”这个预处理引导命令可以看出,该文件既可由 C 编译器编译,亦可由
C++编译器编译。第一个#include 命令包括 jni.h——一个头文件,作用之一是定义在文件其
余部分用到的类型;JNIEXPORT 和 JNICALL 是一些宏,它们进行了适当的扩充,以便与
那些不同平台专用的引导命令配合;JNIEnv,jobject 以及 jstring 则是 JNI 数据类型定义。
评论