[错误处理] JNA依赖多个dll/so文件时出现UnsatisfiedLinkError


问题

在JNA中,如果一个dll有其他依赖dll,在JAR包中运行时会出现找不到依赖的UnsatisfiedLinkError: Unable to load library Native library

解决方法

JNA在JAR中运行时,会将直接绑定的dll解压到一个临时目录中,我们需要把依赖也一起手动解压

val file = Native.extractFromResourcePath("WebView2Loader.dll",WebviewJNA::class.java.classLoader)

// 重命名
val dest = file.toPath().parent.resolve("WebView2Loader.dll")
if(Files.notExists(dest)) {
	Files.move(file.toPath(),dest)
}
  • classLoader的参数虽然是可选的但最好加上,否则会在引用库的代码中找不到依赖
  • 也可以不使用JNA的extractFromResourcePath,将dll复制到System32,当前路径均可
  • 重命名也是必要的,如果手动不重命名,extractFromResourcePath解压出来的dll是随机的名称,如果程序依赖dll的名称工作,也会出错

环境

JNA 5.11