use*_*767 7 c++ java java-native-interface multithreading uncaughtexceptionhandler
我有一个运行一系列任务的Java库.我使用以下方法注册了默认的未捕获异常处理程序
Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());
UncaughtExceptionHandler实现UncaughtExceptionHandler并仅记录错误信息STDERR.
我的Java库是通过JNI从C++代码调用的,JNI正在调用它,ExceptionCheck()并在C++中将错误记录为FATAL.
问题是:
在运行时,当RuntimeException我的Java代码中发生(或任何其他未捕获的异常)时,错误是在C++中捕获的,而不是我JavaUncaughtExceptionHandler注册为线程默认的未捕获异常处理程序.
DefaultUncaughtExceptionHandler真正得到了叫什么?我知道在线程关闭之前,但具体在JNI情况下.是在返回C++之前还是在C++代码完成之后调用的.我认为这与JNI中的线程管理有关,请分享任何相关信息.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, ...);
Run Code Online (Sandbox Code Playgroud)
当从 C 调用它时,它总是返回,但在使用之前return_value,您必须检查该方法是否正常返回或引发异常。
如果它引发了异常,则该异常无法“未被捕获”,如果C代码没有调用(*env)->ExceptionClear(env)(即,如果C代码没有“捕获”异常),那么我不记得是什么发生了,但我不认为这是好事。