0

我对 Eclipse 快要发疯了。我编写了使用外部 jar 的简单测试类。当我从 Eclipse 运行时,它使用本机库 .dll,命令运行。这是我的堆栈跟踪:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Program Files\YAZ\bin\yaz4j.dll: The specified procedure could not be found
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at org.yaz4j.Connection.<clinit>(Connection.java:56)
    at ru.Test.testConnection(Test.java:20)
    at ru.Test.main(Test.java:15)

但是当我像这样从控制台运行这段代码时

java -cp "bin;C:\Program Files\YAZ\java\yaz4j.jar" ru.Test

一切都很完美!这是相同的代码。它如何在控制台中工作而不在 Eclipse 中工作?

这里我如何将这个引用的 jar 插入到我在 Eclipse 中的项目中: 在此处输入图像描述

4

3 回答 3

0

当本地方法无法链接时,您收到的消息是可怕的。我可以想到几个可能给出此消息的根本原因:

  1. 从 Eclipse 加载时,该 DLL 没有加载其他一些依赖的 DLL。这由 Windows PATH 环境变量控制,当您在 Eclipse 中运行时,它可能会有所不同。
  2. 这是一个 32 位 DLL,您在 Eclipse 下使用 64 位 JVM 运行,但从命令行运行 32 位(反之亦然)。
于 2013-04-18T04:30:45.573 回答
0

我有同样的问题,你需要 JDK 而不是 JRE 构建路径库

于 2014-01-30T00:34:51.850 回答
0

几天来,我一直在努力解决完全相同的问题,现在尝试在我的项目中使用 YAZ 工具包。问题是本机库可以在各种测试计算机上正确加载,但不能在我的个人 PC 上。

简而言之:问题的原因是JVM加载了不正确的libxml2.dlllibxslt.dll依赖库。

当我从 IDE 启动 JVM 时,它开始在以下位置查找本机库:

  1. (jdk_home_dir)\jre\bin。在加载依赖库(除了主要的 yaz4j.dll 之外)时,在所有其他测试计算机上以某种方式跳过了此步骤。这样测试计算机就不会加载错误的 dll。
  2. (jdk_home_dir)\bin
  3. 如果您设置 -Djava.library.path 参数,它将在此步骤中查找该目录
  4. %SystemRoot%\system32
  5. %系统根%
  6. 为项目设置的工作目录(如果有)。由于未知原因,在我的个人 PC 上跳过了此步骤,但在所有其他测试计算机上都有效。
  7. 路径%

我已经通过使用Process Monitor弄清楚了这一点。请注意,步骤 1 和 2 可以互换。

名为yaz4j.dll的 YAZ 工具包主 DLL对工具包中的其他 dll 进行二次调用:libxml2.dlllibxslt.dll(以及其他)。我的 JVM 在(jdk_home)\jre\bin目录中找到它们。它们似乎与 Java 捆绑在一起,并且与 YAZ 工具包中的那些明显不同。这意味着在这些 dll 中找不到 yaz4j.dll 调用的过程。这样就会抛出 UnsatisfiedLinkException。

无论环境 %path% 变量或 -Djava.library.path 开关如何,我的 JVM 似乎总是首先在(jdk_home)\jre\bin中搜索本机库。替换该目录中的 dll 可能会破坏一些 JVM 本机功能,因此我不建议这样做。

所以最后需要做的就是弄清楚如何让 JVM 加载正确的libxml2.dlllibxslt.dll库。

重新编译yaz4.dll以使其指向重命名的libxml2.dlllibxslt.dll可能是一个潜在的解决方案。

于 2013-06-08T10:55:29.967 回答