我有一些 Java 代码来创建关闭挂钩,以便在客户端按下 ctrl+C 时干净地退出:
private static void shutdownHandler(Thread mainThread) {
try {
mainThread.join(30000);
} catch (InterruptedException e) {
}
}
public static void main(String[] args) {
final Thread mainThread = Thread.currentThread();
Thread shutdownThread = new Thread(() -> shutdownHandler(mainThread));
Runtime.getRuntime().addShutdownHook(shutdownThread);
}
当我从命令行运行它时,它按预期工作(主线程退出并几乎立即返回到命令提示符)。但是,如果我编写一个 JNI 包装器,使用以下 C++ 代码调用它:
JavaVMInitArgs vm_args;
// Populate vm_args
JavaVM *jvm;
JNIEnv *env;
JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &vm_args);
jclass mainClass = env->FindClass("path/to/my/class");
jmethod mainMethod = env->GetStaticMethodID(mainClass, "main", "([L" STRING_CLASS ";)V");
jclass stringClass = env->FindClass(STRING_CLASS);
jobjectArray mainArgs = env->NewObjectArray(0, stringClass, NULL);
env->CallStaticVoidMethod(mainClass, mainMethod, mainArgs);
jvm->DestroyJavaVM();
然后该shutdownHandler方法挂起,直到 30 秒超时过去,然后将控制权返回给 C++ 代码并最终退出。有没有人知道shutdownHandler从 JNI 调用开始时允许方法加入主线程的方法?
慕勒3428872
相关分类