Java将dll拷贝到resources后无法加载报错 Expecting an absolute path of the library
在Java中加载本地库(dll文件),需要使用System.load()或System.loadLibrary()方法。这些方法需要传入库文件的绝对路径。
如果将dll文件拷贝到resources目录下,它会被打包到生成的JAR文件中,无法直接访问。所以,你需要先将dll文件从JAR文件中解压出来,然后再加载。
以下是一个示例代码,展示了如何加载resources目录下的dll文件:
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
// 获取dll文件在resources目录中的路径
String dllPath = Main.class.getResource("/mydll.dll").getPath();
// 创建一个临时目录,用于存放解压后的dll文件
File tempDir = new File(System.getProperty("java.io.tmpdir"), "mydll");
tempDir.mkdirs();
// 解压dll文件到临时目录
File dllFile = new File(tempDir, "mydll.dll");
try (InputStream inputStream = Main.class.getResourceAsStream("/mydll.dll");
OutputStream outputStream = new FileOutputStream(dllFile)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
// 加载解压后的dll文件
System.load(dllFile.getAbsolutePath());
// 调用dll中的方法
nativeMethod();
} catch (IOException e) {
e.printStackTrace();
}
}
// 声明一个本地方法
private static native void nativeMethod();
}
这段代码假设你的dll文件名是mydll.dll,并且位于resources目录下。它会将dll文件解压到临时目录,并通过System.load()方法加载解压后的dll文件。你需要替换代码中的mydll.dll为你实际的dll文件名。
请注意,这种加载方式只适用于单个dll文件。如果你有多个dll文件需要加载,可以使用相同的方法,分别解压和加载每个文件。
另外,如果你使用的是Maven或Gradle等构建工具,你可能需要将dll文件的路径添加到构建配置文件中,以确保它被正确地打包到JAR文件中。
原文地址: http://www.cveoy.top/t/topic/jdJe 著作权归作者所有。请勿转载和采集!