假设我有以下 Java 代码:
public class Test {
public static int foo() {
throw new RuntimeException();
}
}
它以通常的方式加载本机库。本机库注册并缓存 JVM 或其他任何东西,然后稍后执行此函数:
JNIEnv* sEnv; // initialised somewhere properly
void throwMeARiver() {
jclass c = sEnv->FindClass("Test");
jmethodID m = sEnv->GetStaticMethodID(c, "foo", "()I");
jint i = sEnv->CallStaticIntMethod(c, m);
printf("Got %d\n", (int)i);
}
显然 sEnv->CheckException() 现在将返回 JNI_TRUE,但是本机函数会打印出什么?在 Java 中,抛出异常会使 JVM 停止执行它所在的方法,直到找到合适的处理程序,所以 foo() 的返回值是未定义的。那么我也是未定义的吗?
我找不到任何规格或任何其他说明,所以大概我 /is/ 未定义。在这种情况下,与大多数 JNI 函数不同,CallStaticIntMethod 没有“正常”范围。
我现在正在尝试这个,但我主要是问这个,看看某处是否有强制行为。