该资源主要讨论的是如何在Java Native Interface (JNI) 中妥善处理异常,特别是在分析Linux内核源代码的上下文中。JNI是Java平台的一个特性,它允许Java程序调用C或C++编写的本地代码,实现Java与本地代码的交互。
6.2 妥善地处理异常
在JNI编程中,程序员需要预见可能出现异常的地方并编写适当的代码进行检查。这是因为异常处理是确保程序健壮性和高质量的关键环节,即使这可能导致代码变得较为复杂。异常的处理通常涉及检查函数返回值,以确定是否发生了错误。
6.2.1 异常检查
异常检查通常有两种方式:
1. 函数返回值检查:大部分JNI函数会通过返回NULL或其他特定值来表示已发生错误,并表明当前线程存在异常需要处理。例如,在获取字段ID(GetFieldID)时,即使字段存在于类中,也需要检查返回值,因为虚拟机可能因内存不足而无法分配字段ID。
以下是一个Java类`Window`的示例,其中包含了几个实例字段,以及一个本地方法`initIDs()`用于初始化字段ID的缓存:
```java
public class Window {
long handle;
int length;
int width;
static native void initIDs();
static {
initIDs();
}
}
```
对应的C代码实现`Window.initIDs()`,在这段代码中,会检查`GetFieldID`的返回值以确保没有异常:
```c
jfieldID FID_Window_handle;
jfieldID FID_Window_length;
jfieldID FID_Window_width;
JNIEXPORT void JNICALL
Java_Window_initIDs(JNIEnv *env, jclass classWindow) {
// 检查并处理异常
}
```
在这个例子中,如果`GetFieldID`返回NULL,意味着出现了异常,需要进行相应的错误处理。
JNI适用于以下情况:
1. 重用已有的C/C++代码库在Java程序中。
2. 自行实现Java虚拟机。
3. 学习跨语言协作,特别是垃圾回收和多线程的实现。
4. 在C/C++程序中集成虚拟机实现。
这本书是为开发者准备的,涵盖了自JNI1997年发布以来Sun工程师和众多开发者的经验总结。书中不仅介绍了JNI的设计理念,还包含了一部分JNI规范,供JNI程序员作为手册参考。此外,对于JVM开发者来说,实现虚拟机时,这些规范是必须遵循的。
书中的内容分为三部分:
1. 对初学者的简单JNI介绍。
2. 系统介绍JNI的各种特性,通过实例解释其用法。
3. 技术规范手册,适合经验丰富的开发者和自行实现JNI规范的人。
书本假设读者具备Java和C/C++的基础知识,并旨在满足不同层次读者的需求。通过学习JNI,开发者可以在使用Java平台的同时,充分利用现有的本地代码资源,实现Java和本地代码的无缝交互。