Java 带有void*参数的JNA回调函数
映射以void*作为参数的回调函数的正确方法是什么 我正在使用JNA处理本机库(.dll)。 库定义了以下回调函数:Java 带有void*参数的JNA回调函数,java,c++,jna,Java,C++,Jna,映射以void*作为参数的回调函数的正确方法是什么 我正在使用JNA处理本机库(.dll)。 库定义了以下回调函数: typedef void(u stdcall*NotifyFunc)(int-code,void*value) 以下是它在java中的映射方式: public static NatLib.NotifyFunc notifyFunction = new MyNotifyFuncImpl(); public static void main(String[] args) {
typedef void(u stdcall*NotifyFunc)(int-code,void*value)代码>
以下是它在java中的映射方式:
public static NatLib.NotifyFunc notifyFunction = new MyNotifyFuncImpl();
public static void main(String[] args) {
NatLib.INSTANCE.SetCallbackFunc(notifyFunction);
}
public interface NatLib extends Library {
NatLib INSTANCE = Native.load("Nat.dll", NatLib.class);
//...
void SetCallbackFunc(NotifyFunc func);
interface NotifyFunc extends Callback {
void MyNotifyFunc(int code, Pointer value);
}
}
public static class MyNotifyFuncImpl implements NatLib.NotifyFunc {
@Override
public void MyNotifyFunc(int code, Pointer value) {
System.out.println("Notification: " + Integer.toHexString(code));
}
}
我设置了回调函数。但是,问题从运行时开始。回调函数只执行一次,然后java应用程序失败,退出值为非零-1073740791。未生成hs_err_pid*日志文件
地图有问题吗?我找不到以void*为参数的映射示例。通常,void*被映射为指针,当它被用作参数时会有所不同吗?
每次回调后是否需要释放内存?我试着做Native.free(Pointer.nativeValue(value))代码>内部回调,但这并没有解决问题
另外,我确实读过stackoverflow的问题,但这似乎不是我的情况。我将回调声明为静态成员publicstaticnatlib.NotifyFunc notifyFunction=newmynotifyfuncimpl()代码>-这应该保持对回调函数的引用不变,并且不会在运行时进行垃圾收集。问题在于,如果回调函数是\uu stdcall
函数,则不能使用回调。在这种情况下,您需要实现StdCallLibrary.StdCallCallback
。因此,您的代码应该如下所示:
interface NotifyFunc extends StdCallLibrary.StdCallCallback{
void MyNotifyFunc(int code, Pointer value);
}
这背后的原因是\uu stdcall
用于调用Win32 API的函数。如果您只使用回调
Jna不知道它必须使用这些。这是否回答了您的问题@DanielWiddis不幸的是没有。我读过这个问题,但我的情况似乎不同。我在运行时通过声明回调函数static-public static NatLib.NotifyFunc notifyFunction=new MyNotifyFuncImpl()来保持对回调函数的强引用代码>API是否告诉您指针位置的预期内容?您可能需要为其分配一定大小的内存,例如,Pointer p=new memory(size)代码>。崩溃表明内存未分配。搜索退出代码似乎表明软件/驱动程序存在潜在问题,通常是Nvidia。