通过JNI或JNA注册从Java到C的回调

sev*_*ves 0 java java-native-interface jna

我有一个C API,我想在Java应用程序中使用.我不是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);
Run Code Online (Sandbox Code Playgroud)

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

tec*_*age 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);
...
Run Code Online (Sandbox Code Playgroud)

可以说JNI版本相当长,而且你有一个原生的编译步骤来解释.