Java 带有void*参数的JNA回调函数

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) {

映射以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) {

    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。