Требуется прочитать спецификацию JNI , если вы хотите заниматься каким-либо JNI-программированием.
Существует два сценария вызова кода Java из C. В первом случае программа Java вызывает метод native , передавая управление C. Функция C получает в качестве первого аргумента JNIEnv
указатель, который является основным дескриптором, используемым для доступа к JNI. Типичный вызов из Java в C выглядит следующим образом:
jenv->CallStaticMethod(jenv, cls, ...);
(Обратите внимание, что в C ++ вызовы являются правильными методами, поэтому вам не нужно передавать jenv
в качестве первого аргумента.) Это довольно просто; Java вызывает C, который вызывает обратно в Java.
Второй случай немного сложнее, и его следует использовать, когда у вас есть C-код, который должен выполнять «спонтанный» вызов в Java, т. Е. Не в результате того, что этот код сначала вызывается из Java. Обычно это тот случай, когда у вас есть собственный поток, генерирующий события (как в вашем случае). Затем вам нужно использовать часть JNI, называемую Invocation API . Этот API-интерфейс используется в два этапа: сначала вы запрашиваете ссылку на JVM, которую хотите вызвать (некоторые реализации JVM поддерживают несколько JVM в одном процессе), а второй шаг - запрос указателя JNIEnv
для выполнения вызовов. в JVM.
Чтобы получить указатель JNIEnv
для выполнения вызовов в JVM, собственный поток должен «присоединиться» к JVM. Это сделано для того, чтобы JVM «знала» о потоке, и после присоединения потока к JVM поток можно рассматривать как любой другой поток Java (на самом деле, я не уверен, что есть какие-либо реальные отличия). Если вы проверяете потоки JVM в отладчике, собственный поток будет отображаться как любой другой поток. Обратите внимание, что вы можете пометить собственный поток как поток демона, поэтому при выходе из JVM этот поток будет уничтожен.
Обратите внимание, однако, что вам нужно будет принять надлежащих мер предосторожности при выполнении действий в обработчике сигналов Unix. Я бы порекомендовал не вызывать Java непосредственно из обработчика сигнала.