如何使用 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 <stdexcept>
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 方法名称映射到链接器符号。

最新更新