【问题标题】:Issue while loading a dll library file... java.lang.UnsatisfiedLinkError: Can't load library加载 dll 库文件时出现问题... java.lang.UnsatisfiedLinkError: Can't load library
【发布时间】:2011-01-25 07:55:22
【问题描述】:

在加载 dll 文件时,我收到以下异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError:
  D:\Transliteration\rlpnc-3.1.0-sdk-ia32-w32-msvc80\rlp\bin\ia32-w32-msvc80\btrntjni.dll: 
  The system cannot find message text for message number 0x%1 in the message file for %2

at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at com.basistech.util.internal.Native.loadLibrary(Unknown Source)
at com.basistech.rnt.jni.<clinit>(Unknown Source)
at com.basistech.rnt.RNTEnvironment.<init>(Unknown Source)
at SampleTranslator.<init>(TranslateNameSample.java:88)
at TranslateNameSample.main(TranslateNameSample.java:62)

不确定问题的根本原因。谁能帮我解决这个问题。

谢谢, 巴斯卡

【问题讨论】:

  • 你找到原因了吗?

标签: java dll jakarta-ee classloader loadlibrary


【解决方案1】:

我为生产您尝试使用的产品的公司工作。当它被安装到我们附带的不兼容的底层版本时,我们已经看到了这个错误,因为正如其他人所建议的那样,缺少依赖的 DLL。如需更多帮助,请随时联系我们的支持团队。

【讨论】:

    【解决方案2】:

    这与类路径无关。将 DLL 放在当前目录、PATH 环境变量中列出的目录之一中,或者最好放在 本机库搜索路径 中,使用系统属性 java.library.path 进行设置:

    java -Djava.library.path=C:\MyNativeLibs MyMainClass
    

    【讨论】:

    • 目录已经列在 PATH 环境变量中。但我仍然收到此错误。为了简单起见,这是我要运行的代码。 public class testClass { public static void main(String[] args) { System.loadLibrary("btrntjni"); } }
    • 出现以下异常。线程“main”中的异常 java.lang.UnsatisfiedLinkError: D:\Transliteration\rlpnc-3.1.0-sdk-ia32-w32-msvc80\rlpnc\samples \java\btrntjni.dll: 系统在 java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(Unknown) 的 %2 的消息文件中找不到消息号 0x%1 的消息文本源) 在 java.lang.ClassLoader.loadLibrary(Unknown Source) 在 java.lang.Runtime.loadLibrary0(Unknown Source) 在 java.lang.System.loadLibrary(Unknown Source) 在 testClass.main(testClass.java:7)
    【解决方案3】:

    除了检查您是否将 DLL 的路径放入正确的环境变量中,您还应该检查以下内容:

    • 您正在加载的 DLL 已满足其所有依赖项。也就是说,如果这个 DLL 依赖于其他 DLL,请确保这些 DLL 也可以找到。

    • 如果正在加载的 DLL 使用清单来指定特定的 DLL,请确保 DLL(清单中指定的版本)也在机器上(或在 GAC 中,如果需要)并且可以找到

    • 检查 Java 代码中引用的所有 DLL 函数是否已正确定义和导出,并导出与 Java 代码所期望的数据类型相同的数据类型。这不会停止 DLL 加载,但很可能会扰乱下一阶段 - 解析链接地址或使应该工作的函数以意想不到的方式失败。

    从中获得很多乐趣 - 很多小事让你绊倒。几年前,我不得不处理一个文本到语音包(在 DLL 中的 C 和 C++ 中)与不同版本的 Java 以及新旧 JNI 样式一起工作的问题。真是一团糟!

    【讨论】:

      【解决方案4】:

      我自己还没有看到这个问题,但从错误消息中听起来,DLL 所需的某些依赖项要么丢失,要么版本不正确。

      此工具可能会有所帮助:http://www.dependencywalker.com/

      【讨论】:

        【解决方案5】:

        对我来说,将 dll 路径添加到我的 IDE 中的 VM 选项是可行的。

        【讨论】:

          【解决方案6】:

          检查“java.library.path”是否包含包含 .dll 文件的文件夹。
          在 Windows 机器上,它与 PATH 相关。
          http://www.inonit.com/cygwin/jni/helloWorld/load.html

          【讨论】:

          • 是的,它包含但仍然出现问题:(
          • 请发布完整的 CLASSPATH
          • 在这里.. D:\apache-ant-1.8.0\lib;D:\Transliteration\rlp-6.5.0-sdk-ia32-w32-msvc80\rlp\lib\ia32 -w32-msvc80;D:\音译\rlpnc-3.1.0-sdk-ia32-w32-msvc80\rlp\lib\ia32-w32-msvc80;D:\音译\rlpnc-3.1.0-sdk-ia32-w32 -msvc80\rlpnc\samples\java;D:\Transliteration\rlp-6.5.0-sdk-ia32-w32-msvc80\rlp\bin\ia32-w32-msvc80;D:\Transliteration\rlpnc-3.1.0-sdk -ia32-w32-msvc80\rlp\bin\ia32-w32-msvc80;.
          • 同意 Dmitry,JRE 不使用 CLASSPATH 来查找本机库.. 它使用库路径。
          • 我的坏。它应该是“Java 库路径”。对于 Windows,它包括 PATH - inonit.com/cygwin/jni/helloWorld/load.html 正在更新答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-16
          • 2010-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多