我正在使用 JNA 调用 dll 文件的函数。
简单DLL.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);
};
}
简单DLL.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 main:
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”。
Use extern "C"
为了避免导出函数的名称修改,请重命名 Java 函数以匹配导出的链接器符号,或使用 FunctionMapper 将 Java 方法名称映射到链接器符号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)