Java UncaughtExceptionHandler没有使用JNI获得任何异常

时间:2016-08-24 15:33:43

标签: java c++ multithreading java-native-interface uncaughtexceptionhandler

我有一个运行一系列任务的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块之外的其他替代方法)
  4. 非常感谢。

1 个答案:

答案 0 :(得分:1)

听起来你在谈论 Java Invocation API (即,你是在C ++程序中调用Java方法,而不是简单的JNI,其中调用是另一种方式。)< / p>

我不是一个大专家,但我使用过Java Invocation API。

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

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

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

当从C调用它时,它总是返回,但在使用return_value之前,你必须检查方法是否正常返回或引发异常。

如果它引发了例外,那么例外情况就无法被解除&#34;未被捕获&#34;,如果C代码没有调用(*env)->ExceptionClear(env)(即,如果C代码没有&#34;捕捉&#34;异常),然后我不记得会发生什么,但我认为它不好。