Java UncaughtExceptionHandler 使用 JNI 没有任何异常

Java UncaughtExceptionHandler haven't got any exception using JNI

本文关键字:任何 异常 JNI UncaughtExceptionHandler 使用 Java      更新时间:2023-10-16

我有一个运行一系列任务的Java库。我注册了一个默认的未捕获异常处理程序,使用:

Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());

UncaughtExceptionHandler实现UncaughtExceptionHandler,只记录STDERR中的错误信息。

我的Java库是通过JNI从c++代码调用的,JNI使用ExceptionCheck()调用它,并将错误记录为c++中的FATAL。

问题是:

在运行时,当我的Java代码中发生RuntimeException(或任何其他未捕获的异常)时,错误在c++中被捕获,而不是我的JavaUncaughtExceptionHandler注册为线程默认未捕获的异常处理程序。

  1. 这是异常行为吗?
  2. DefaultUncaughtExceptionHandler到底什么时候会被调用?我知道在线程被关闭之前,但是在JNI的情况下。是在返回c++之前调用还是在c++代码完成之后调用?我认为这与JNI中的线程管理有关,请分享任何相关信息。
  3. 无论如何我都可以捕获Java代码中的所有异常(除了放置try/catch块之外的其他替代方法)

听起来您在谈论Java调用API(即,您从c++程序中调用Java方法,而不是简单的JNI,其中调用的方向相反。)

我不是什么专家,但是我用过Java调用API。

据我所知,只有当Java线程的run()方法抛出异常时,才会调用未捕获的异常处理程序。但是在C/c++代码创建的线程中没有任何run()方法。

我写的是C,而不是c++,所以我对Java的调用看起来都像

jobject return_value = (*env)->CallObjectMethod(env, instance, method_id, ...);

当从C调用该方法时,它总是返回,但在使用return_value之前,必须检查该方法是正常返回还是抛出异常。

如果它抛出了一个异常,没有办法为异常"未捕获",如果C代码不调用(*env)->ExceptionClear(env)(即,如果C代码不"捕获"异常),那么我不记得发生了什么,但我不认为这是好的。