Допустим, у нас есть метод в нашей библиотеке C, который уведомит приложение, если запись была удалена другим процессом. Он предоставляет нам метод для добавления обратного вызова,
int register_delete_monitor (void * fn);
и ожидаемый обратный вызов принимает параметр записи.
В нашей библиотеке Java мы создали бы Callback для этого метода:
интерфейс DeletedRecordCallback расширяет Callback {
void callback (Запись r);
}
...
// и в нашем интерфейсе библиотеки:
int register_delete_monitor (DeletedRecordCallback drc);
Теперь мы можем передать реализацию нашего DeletedRecordCallback и зарегистрировать его в качестве обратного вызова в библиотеке C.
Есть одно предупреждение с использованием обратных вызовов в JNA. Обратный вызов не должен собирать мусор, если он не зарегистрирован. Это особенно верно для долгоживущих обратных вызовов. Вызов обратного вызова со сборщиком мусора приведет к сбою виртуальной машины. Этого можно просто избежать, если использовать экземпляр обратного вызова - в этом контексте синглтон будет работать очень хорошо. В противном случае важно, чтобы экземпляр обратного вызова отменял свою регистрацию в методе finalize.