在JNA中将回调转换为指针

  • 本文关键字:转换 指针 回调 JNA jna
  • 更新时间 :
  • 英文 :


我一定遗漏了什么。给定一个实现com.sun.jna.Callback的类的实例,我如何获得函数指针地址作为Pointer,以便将其传递给使用void*参数的函数(我使用的是Pointer)。

具体来说,我想使用函数地址的CFNumberCreate(Pointer, int, Pointer)创建一个CFNumber(也称为NSNumber*),这样我就可以调用SetSpeechProperty来注册SpeechDoneProcPtr

您没有。您传递回调实例并让JNA处理指针转换。请确保保留对回调对象的强引用,这样它就不会得到GC’d。

如果需要,可以制作另一个使用回调类型而不是Pointer的函数映射。

可以获取回调实例的本机指针值,但需要这样做的原因很少。

我仍然需要将回调转换为指针,我发现了一个肮脏的破解方法。使用具有零长度副本的回调调用memcpy()。memcpy()将回调作为指针返回。

对于Windows,我定义了memcpy()所在的库:

public interface msvcrt extends StdCallLibrary {
  Pointer memcpy(Callback dst, Callback src, int size);
}

然后像这样使用:

public Pointer callbackToPointer(Callback callback) {
  msvcrt crt = (msvcrt)Native.loadLibrary("msvcrt", msvcrt.class);
  return crt.memcpy(callback, callback, 0);  //zero length copy returns dest
}

塔达!

最新更新