0

我有一个想在 Java 应用程序中使用的 C API。我对 JNI 并不陌生,但我不知道这次 JNA 是否会是更好的选择。本机函数“RegisterCallback”通过调用函数指针从另一个线程定期发送更新。如何通过 JNI/JNA 将 Java 函数注册到此本机函数指针 (void *pFunc)?

typedef unsigned long DWORD;
typedef void* HANDLE;
typedef enum _Type
{
Update,
Result
} TYPE;

DWORD RegisterCallback(HANDLE handle, TYPE type, void *pFunc);

你怎么看?JNA 还是 JNI?示例代码非常受欢迎。

4

1 回答 1

5

这就是它在 JNA 中的样子:

public interface MyLibrary extends Library { /* StdCallLibrary if using __stdcall__ */
    interface MyCallback extends Callback { /* StdCallCallback if using __stdcall__ */
        void invoke(/* fill your parameters here*/); 
    }
    DWORD RegisterCallback(HANDLE handle, int type, MyCallback callback);
}

...
MyLibrary lib = (MyLibrary)Native.loadLibrary("mylib", MyLibrary.class/*, options*/);
MyCallback callback = new MyCallback() {
    public void invoke() {
        System.out.println("Success!");
    }
};
HANDLE h = ...;
int type = ...;
lib.RegisterCallback(h, type, callback);
...

可以说 JNI 版本要长一些,再加上你需要考虑一个本地编译步骤。

于 2013-09-10T10:42:34.753 回答