我有一些 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_argsJavaVM *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 調用開始時允許方法加入主線程的方法?
從 JNI 運行時,Java ShutdownHook 無法加入主線程
慕田峪9158850
2021-11-11 14:05:54
