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

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

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

所有这些 dll 都在 Web 应用程序中WEB-INF/lib


答案 1

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

此外,对于 ,可以指定库的基本名称,而不在末尾指定 。因此,对于 ,您只需使用 .loadLibrary().dll/path/to/something.dllSystem.loadLibrary("something")

您还需要查看您获得的确切值。如果它说像这样:UnsatisfiedLinkError

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

然后它找不到 foo 库 (foo.dll) 在你的 or .如果它说像这样:PATHjava.library.path

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() {
    }

}

答案 2

在运行时更改'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 库路径


推荐