Как: прослушивание Java для событий, захваченных потоком C - PullRequest
2 голосов
/ 17 января 2009

Я хотел бы создать Java-программу для прослушивания и ответа на события, захваченные потоком в C.
Может кто-нибудь объяснить, как это может быть достигнуто с помощью JNI, или указать мне онлайн-учебники?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 января 2009

Требуется прочитать спецификацию 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 непосредственно из обработчика сигнала.

2 голосов
/ 17 января 2009

Вы можете заставить собственный код вызывать метод Java для получения события. Есть несколько статей о JNI, которые могут вам помочь, например Как вызывать функции Java из C с помощью JNI .

...