jni::ExceptionDescribe 是否隐式清除了JNI 环境对象的异常跟踪?

Does jni::ExceptionDescribe implicitily clear the exception trace of the JNI environment object?

我试图实现某种异常处理

起初我打电话 jni::ExceptionDescribe()

之后我使用了

的实现

How to obtain a description of a Java exception in C++ when using JNI?

为了简单起见,我只是命名了它 printStackTrace()并且完全可以正常工作 .

我的问题是我不能像这样组合使用它们。

一些 C++ 代码

void aCppMethod() {

     jni::ExceptionDescribe(); //Works
     printStackTrace(); // No stack trace avaiable because JNI Env does not hold any exception

}

但是

void aCppMethod() {
  // jni::ExceptionDescribe(); //commented out
  printStackTrace(); // Works, where printStackeTrace just prints the Exception into a single log file

    }

我的问题是 jni::ExceptionDescribe() 是否从 Java 环境对象中隐含地删除了异常,是否有可能以简单的顺序使用这两个函数。

或者更好。是否有任何挂钩或覆盖机制来增强或更改 jni::ExceptionDescribe()

的行为

我需要这两种行为的原因是因为我想使用适当的 C++ 代码作为简单的 Windows 可执行文件和 DLL。

显然描述的行为是 18 年前在 Windows 上报道的,请检查 here。然后解释 "it looks like addressed" bug 在 2002 年被关闭。你所描述的看起来与提到的 bug 非常相似。

根据 Shen Liang 的说法,Java 本机界面, Addison Wesley 1999,p. 211:

This function has the side effect of clearing the pending exception.