在JNA中将回调转换为指针

时间:2013-06-24 18:47:43

标签: jna

我一定错过了什么。给定一个实现com.sun.jna.Callback的类的实例,如何将函数指针地址作为Pointer,以便我可以将它传递给一个带void*参数的函数(I我正在使用Pointer)。

具体来说,我想使用CFNumberCreate(Pointer, int, Pointer)创建一个CFNumber(又名NSNumber*)和函数的地址,以便我可以调用SetSpeechProperty来注册{ {3}}

2 个答案:

答案 0 :(得分:1)

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

如果需要,请创建另一个使用回调类型而不是Pointer的函数映射。

可以获得native pointer value for a callback instance,但是你需要的原因很少。

答案 1 :(得分:0)

我仍然需要将回调转换为指针,我发现了一个糟糕的黑客攻击。 使用具有零长度副本的Callback调用memcpy()。 memcpy()将Callback作为指针返回。

对于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
}

多田!