java.lang.UnsatisfiedLinkError no \*\*\*\*\*.dll in java.library.path

新手上路,请多包涵

如何在我的 Web 应用程序中加载自定义 dll 文件?我试过以下方法:

  • 将所有必需的 dll 复制到 system32 文件夹中,并尝试在 Servlet 构造函数 System.loadLibrary 中加载其中之一
  • 将所需的 dll 复制到 tomcat_home/shared/libtomcat_home/common/lib

所有这些dll都在网络应用程序的 WEB-INF/lib

原文由 Ketan Khairnar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 461
2 个回答

为了 System.loadLibrary() 工作,库(在 Windows 上,一个 DLL)必须位于您的 PATH java.library.path 中列出的路径中的某个目录中 --- 系统属性(因此您可以像 java -Djava.library.path=/path/to/dir 一样启动 Java)。

此外,对于 loadLibrary() ,您指定库的基本名称,末尾没有 .dll 。因此,对于 /path/to/something.dll ,您只需使用 System.loadLibrary("something")

您还需要查看确切的 UnsatisfiedLinkError 您得到的。如果它说类似的话:

 Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path

然后它在您的 PATHjava.library.path 中找不到 foo 库 (foo.dll)。如果它说类似的话:

 Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V

那么库本身就有问题,因为 Java 无法将应用程序中的本机 Java 函数映射到其实际的本机对应函数。

首先,我会围绕您的 System.loadLibrary() 调用进行一些记录,以查看它是否正确执行。如果它抛出异常或不在实际执行的代码路径中,那么您将始终得到后一种类型 UnsatisfiedLinkError 上面解释过。

作为旁注,大多数人将他们的 loadLibrary() 调用放入带有本机方法的类中的静态初始化程序块中,以确保它始终恰好执行一次:

 class Foo {

    static {
        System.loadLibrary('foo');
    }

    public Foo() {
    }

}

原文由 Adam Batkin 发布,翻译遵循 CC BY-SA 2.5 许可协议

在运行时更改“java.library.path”变量是不够的,因为它只被 JVM 读取一次。你必须像这样重置它:

 System.setProperty("java.library.path", path);
//set sys_paths to null
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);

请在以下位置获取战利品: 在运行时更改 Java 库路径

原文由 Alexandre 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题