4

クライアントが ctrl+C を押したときに正常に終了するために、シャットダウン フックを作成する Java コードがあります。

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);
}

これをコマンド ラインから実行すると、期待どおりに動作します (メイン スレッドが終了し、すぐにコマンド プロンプトに戻ります)。ただし、代わりに次の C++ コードを使用してこれを呼び出す JNI ラッパーを作成すると:

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++ コードに戻し、最終的に終了します。shutdownHandlerJNI呼び出しから開始されたときにメソッドがメインスレッドに参加できるようにする方法を知っている人はいますか?

4

1 に答える 1