作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要从主 jni 线程在 Java 中发送异常。我使用以下代码来做这样的事情:
if (vm->AttachCurrentThread(reinterpret_cast<void **>(&env), nullptr) != JNI_OK || env == nullptr) {
std::cerr << "Get env for current thread failed.\n";
return ;
}
jclass exClass = env->FindClass("[JavaClassName]");
if (exClass != nullptr) {
env->ThrowNew(exClass, "[ExceptionMessage]");
}
env->DeleteLocalRef(exClass);
vm->DetachCurrentThread();
最佳答案
当您在 JNI 代码中时,附加到您当前线程的 Java 解释器没有运行。因此无法在 Java 端处理异常(展开堆栈帧、捕获等)。 Java 异常被创建为挂起状态,并且只有在 JNI 调用返回到 Java 并且解释器继续为您当前的 Java 线程执行时才真正抛出。
分离这种过程是假的,但可能会使您的 JNI 代码处于不稳定状态:Java 正在运行,JNI 尚未返回并且仍在运行您的代码。
我的首选解决方案是像您一样抛出 Java 异常,然后立即抛出一个 C++ 异常,该异常仅(并且必须)在 JNI 边界处捕获并丢弃。抛出 C++ 异常纯粹是为了导致堆栈展开和从 JNI 调用中快速退出。
关于java - 有没有办法强制 Java VM 立即执行从 JNI 发送的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58658153/
我是一名优秀的程序员,十分优秀!