我肯定错过了什么。给定一个实现的类的实例,com.sun.jna.Callback
我如何将函数指针地址作为 a Pointer
,以便我可以将它传递给带void*
参数的函数(我正在使用Pointer
)。
具体来说,我想使用函数的地址创建一个CFNumber
(又名NSNumber*
)CFNumberCreate(Pointer, int, Pointer)
,以便我可以调用SetSpeechProperty
来注册一个SpeechDoneProcPtr
。
我肯定错过了什么。给定一个实现的类的实例,com.sun.jna.Callback
我如何将函数指针地址作为 a Pointer
,以便我可以将它传递给带void*
参数的函数(我正在使用Pointer
)。
具体来说,我想使用函数的地址创建一个CFNumber
(又名NSNumber*
)CFNumberCreate(Pointer, int, Pointer)
,以便我可以调用SetSpeechProperty
来注册一个SpeechDoneProcPtr
。
你没有。您传递回调实例并让 JNA 处理指针转换。确保你保持对回调对象的强引用,这样它就不会被 GC 处理。
如果需要,请创建另一个使用您的回调类型而不是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
}
多田!