如何使用JNA回调

我正在使用JNA来调用dll文件的函数。

simpleDLL.h:

typedef int (__stdcall *eventCallback)(unsigned int id, int value); namespace test { class hotas { public: static __declspec(dllexport) int readValue(int a); static __declspec(dllexport) void setCallback(eventCallback evnHnd); }; } 

simpleDLL.cpp:

 #include "simpleDLL.h" #include  using namespace std; namespace test { eventCallback callback1 = NULL; int test::readValue(int a) { return 2*a; } void test::setCallback(eventCallback evnHnd) { callback1 = evnHnd; } } 

我的Java界面如下所示:

 public interface DLLMapping extends Library{ DLLMapping INSTANCE = (DLLMapping) Native.loadLibrary("simpleDLL", DLLMapping.class); int readValue(int a); public interface eventCallback extends Callback { boolean callback(int id, int value); } public void setCallback(eventCallback evnHnd); } 

最后java主:

 public static void main(String[] args) { DLLMapping sdll = DLLMapping.INSTANCE; int a = 3; int result = sdll.readValue(a); System.out.println("Result: " + result); sdll.setCallback(new eventCallback(){ public boolean callback(int id, int value) { //System.out.println("bla"); return true; } }); } 

我的问题是我得到了错误,那个java找不到函数setCallback。 我的代码出了什么问题?

谢谢您的帮助!

C ++与C不同。转储DLL中的符号(http://dependencywalker.com),您将看到函数名称(至少从链接器的角度来看)不是“setCallback”。

使用extern "C"可以避免在导出的函数上进行名称修改,重命名Java函数以匹配导出的链接器符号,或使用FunctionMapper将Java方法名称映射到链接器符号。