0

我使用 Eclipse Java 32Bit JDK。我正在尝试导入一个 32 位 DLL,但我得到的文档很少。我正在使用com.sun.jna. InitImagerIPC文档告诉我在没有任何参数的情况下调用该方法。

在这个例子中,我创建了一个接口:

public interface ImagerIPC extends com.sun.jna.win32.StdCallLibrary{ 
  HRESULT InitImagerIPC ();
}

当我尝试导入 DLL 时,不会发生错误。

ImagerIPC lib = (ImagerIPC) Native.loadLibrary ("ImagerIPC", ImagerIPC.class);

UnsatisfiedLinkError但如果我输入错误的 DLL 名称,我会收到一条消息。所以我猜它加载正确?

但是当我尝试打电话时

lib.InitImagerIPC();

我得到UnsatisfiedLinkError. :( 哪里错了?

顺便说一句:DLL 导出查看器为所需方法提取此信息:

_InitImagerIPC@0    0x10001fc0  0x00001fc0  45 (0x2d)   
    ImagerIPC.dll   J:\<my Path>\ImagerIPC.dll  Exported Function

我不确定命名。我还必须添加_吗?

4

1 回答 1

2

您的 DLL 使用 stdcall 调用约定,该约定通常具有编译器 mangle 函数名称以包含参数的堆栈大小。当您加载库(或重新编译库以使用未修饰的名称)时,您需要使用StdCallFunctionMapper传入的选项。Library.OPTION_FUNCTION_MAPPER

Library.loadLibrary("myLib", myLib.class, new HashMap() { { put(Library.OPTION_FUNCTION_MAPPER, new StdCallFunctionMapper()); } });
于 2012-05-21T12:00:04.213 回答