Java方法在抛出异常时返回JNI调用方的内容是什么?

all*_*der 6 java java-native-interface exception

说我有以下Java代码:

public class Test {
  public static int foo() {
    throw new RuntimeException();
  }
}
Run Code Online (Sandbox Code Playgroud)

以通常的方式加载本机库.本机库注册并缓存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);
}
Run Code Online (Sandbox Code Playgroud)

显然,sEnv-> CheckException()现在将返回JNI_TRUE,但是本机函数会打印出来的是什么?在Java中,抛出异常会使JVM停止执行它所在的方法,直到找到合适的处理程序,因此foo()的返回值是未定义的.所以我也未定义?

我找不到任何规格或任何其他说法,所以大概是i/is/undefined.与大多数JNI函数不同,在这种情况下,CallStaticIntMethod没有"正常"范围.

我现在正在尝试这个,但我主要是在问这个问题,看看某个地方是否存在强制行为.

Sam*_*ain 2

虽然变量 i 已被定义,但其值尚未确定。在这种情况下,该值很可能为 0,但前提是 JVM 在其实现中初始化了该值。否则,它将等于内存中其位置上存在的任何数据。

由本机函数的实现者来正确检查CallXXXMethod()via env->CheckException()env->ExceptionOccurred()和后的异常env->ExceptionDescribe()。最后,调用env->ClearException()以删除异常。