JNI包装或回调的替代方法

时间:2011-02-09 08:15:16

标签: java java-native-interface

我需要从Java调用一个本地库,这需要回调注册(然后使用回调)。

对于这种情况,是否有任何JNI或JNI备选方案的包装器? 似乎JNA,HawtJNI和其他人不支持回调Java ...

谢谢!

2 个答案:

答案 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方法中取消注册是很重要的。