У меня есть некоторый 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?