我需要从Java调用一个本地库,这需要回调注册(然后使用回调)。
对于这种情况,是否有任何JNI或JNI备选方案的包装器? 似乎JNA,HawtJNI和其他人不支持回调Java ...
谢谢!
答案 0 :(得分:3)
寻找JNA(Java Native Access),它比JNI更方便。
答案 1 :(得分:1)
假设我们的C库中有一个方法,如果另一个进程删除了一条记录,它将通知应用程序。它为我们提供了一种添加回调的方法,
int register_delete_monitor(void * fn);
并且预期的回调会获取记录的参数。
在我们的Java库中,我们将为此方法创建一个Callback:
interface DeletedRecordCallback扩展Callback { void callback(Record r); } ... //并在我们的图书馆界面中: int register_delete_monitor(DeletedRecordCallback drc);
现在我们可以传入DeletedRecordCallback的实现,并将其注册为C库中的回调。
在JNA中使用回调有一点需要注意。除非已取消注册,否则不得对回调进行垃圾回收。对于长期回调,尤其如此。对垃圾收集回调的调用将使vm崩溃。这可以通过挂起回调的实例来简单地避免 - 单例在这种情况下可以很好地工作。否则,让回调实例在其finalize方法中取消注册是很重要的。