【问题标题】:Any DLL import throws an UnsatisfiedLinkError, though the DLL seems to load任何 DLL 导入都会引发 UnsatisfiedLinkError,尽管 DLL 似乎已加载
【发布时间】:2012-05-27 04:18:21
【问题描述】:

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

就像在这个example 中我创建了一个界面:

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

当我尝试导入 DLL 时,没有出现错误。

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

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

但是当我尝试打电话时

lib.InitImagerIPC();

我收到了UnsatisfiedLinkError。 :( 哪里错了?

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

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

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

【问题讨论】:

  • 请提供堆栈跟踪,包括完整的异常消息。
  • Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function '_InitImagerIPC': Die angegebene Prozedur wurde nicht gefunden. at com.sun.jna.Function.&lt;init&gt;(Function.java:179) at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:344) at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:324) at com.sun.jna.Library$Handler.invoke(Library.java:203) at $Proxy0._InitImagerIPC(Unknown Source) at main.main(main.java:13)

标签: java dll methods import jna


【解决方案1】:

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

Library.loadLibrary("myLib", myLib.class, new HashMap() { { put(Library.OPTION_FUNCTION_MAPPER, new StdCallFunctionMapper()); } });

【讨论】:

    猜你喜欢
    • 2019-12-16
    • 2020-11-15
    • 2023-03-26
    • 2016-11-22
    • 2012-12-07
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多