[错误处理] 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