指向 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);
}
我有一个用 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);
}