2013-06-24 35 views

回答

1

你不知道。您传递回调实例并让JNA处理指针转换。确保你保持对回调对象的强引用,以免它被GC'd。

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

可以得到native pointer value for a callback instance,但也有,为什么你会永远需要很少的原因。

+0

谢谢。尽管它起初感觉很奇怪,但另一个带有Callback参数的'CFNumberRef'构造函数仍然可以正常工作:'public CFNumberRef CFNumberCreate(Pointer alloc,int theType,Callback valuePtr);' – yonran

+0

其实我只是意识到我需要创建一个指针到函数指针](http://stackoverflow.com/a/17685620/471341)。我不能使用'CallbackReference',因为它不是公共类。你知道一种公开的方式来将回调转换为指针吗? – yonran

+1

哦,这是一个疏忽。不过,您可以通过创建带有单个“回调”字段的“结构”来有效地创建“CallbackByReference”。相同的内存布局。 – technomage

0

我仍然需要将回调转换为指针,我发现一个肮脏的黑客做它。 使用长度为零的回调调用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 
} 

田田!