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