Оболочка JNI или альтернатива для обратных вызовов - PullRequest
1 голос
/ 09 февраля 2011

Мне нужно вызвать из Java нативную библиотеку, которая требует регистрации обратного вызова (и затем использования обратных вызовов).

Существует ли какая-либо обертка над JNI или JNI альтернативой для такой ситуации? Кажется, что JNA, HawtJNI и другие не поддерживают обратные вызовы в Java ...

Спасибо!

Ответы [ 2 ]

3 голосов
/ 09 февраля 2011

Ищите JNA (Java Native Access), это гораздо более удобный способ, чем JNI.

1 голос
/ 09 февраля 2011

Допустим, у нас есть метод в нашей библиотеке C, который уведомит приложение, если запись была удалена другим процессом. Он предоставляет нам метод для добавления обратного вызова,

int register_delete_monitor (void * fn);

и ожидаемый обратный вызов принимает параметр записи.

В нашей библиотеке Java мы создали бы Callback для этого метода:

интерфейс DeletedRecordCallback расширяет Callback { void callback (Запись r); } ... // и в нашем интерфейсе библиотеки: int register_delete_monitor (DeletedRecordCallback drc);

Теперь мы можем передать реализацию нашего DeletedRecordCallback и зарегистрировать его в качестве обратного вызова в библиотеке C.

Есть одно предупреждение с использованием обратных вызовов в JNA. Обратный вызов не должен собирать мусор, если он не зарегистрирован. Это особенно верно для долгоживущих обратных вызовов. Вызов обратного вызова со сборщиком мусора приведет к сбою виртуальной машины. Этого можно просто избежать, если использовать экземпляр обратного вызова - в этом контексте синглтон будет работать очень хорошо. В противном случае важно, чтобы экземпляр обратного вызова отменял свою регистрацию в методе finalize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...