gpt4 book ai didi

java - 有没有办法强制 Java VM 立即执行从 JNI 发送的异常?

转载 作者:行者123 更新时间:2023-12-01 01:40:20 25 4
gpt4 key购买 nike

我需要从主 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();

它以某种方式起作用。我发现如果我们不使用附加和分离(只使用抛出),那么只有在来自 Java VM 的 jni 调用完成后才会引发异常。如果我们使用附加和分离,那么在分离调用中会引发异常。这是使事情更快的正确方法吗?我仍然不明白为什么异常处理被推迟到调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com