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?示例代码非常受欢迎.
这就是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版本相当长,而且你有一个原生的编译步骤来解释.