指向 java 中的函数的指针

Pointer to a function in java

我有一个用 C++ 编写的动态 link 库 (DLL)。在我的 DLL 中,我有一个这样的函数:

void set_event_callback(EVENT_CALLBACK callback_fcn);

其中 EVENT_CALLBACK 是一个像这样的函数指针:

void (*EVENT_CALLBACK)(int event_type, byte param1, int param2);

我使用其他语言的 DLL。例如,在 C# 中,我这样调用 set_event_callback

public delegate void EVENT_CALLBACK(int event_type, byte param1, int param2);
EVENT_CALLBACK HandleEventsDelegate = null;
HandleEventsDelegate = new EVENT_CALLBACK(HandleEvents);
set_event_callback(HandleEventsDelegate);

其中 HandleEvents 是这样的函数:

protected void HandleANPREvents(int event_type, byte param1, int param2){ ... }

现在,我想在 Java 中使用我的 DLL。我在我的 java 项目中使用 JNA 调用本机代码。我在 Java.

中找不到函数指针

如何在 Java 中调用 set_event_callback 并将函数传递到我的 DLL?

正如@Mark-Rotteveel 的 所述,您应该使用与回调匹配的单个方法定义一个功能接口。它可能看起来像这样:

// Extend StdCallLibrary if library is __stdcall
public interface YourDLL extends Library {
    YourDLL INSTANCE = // insert library loading code here

    // Define the callback
    // Extend StdCallCallback if library is __stdcall
    interface HandleANPREvents extends Callback {
        // the function name doesn't matter
        void invoke(int event_type, byte param1, int param2);
    }

    // Define the function using the callback
    void set_event_callback(HandleANPREvents callback_fcn);
}

然后您可以在代码中引用 set_event_callback()

public static void main(String[] args) {
    HandleANPREvents fn = new HandleANPREvents() {
        @Override
        void invoke(int event_type, byte param1, int param2) {
            // implementation here
        }
    };
    YourDLL.INSTANCE.set_event_callback(fn);
}