如果您可以更改库的加载代码:在您的 jar/类路径中包含 DLL。然后将 DLL 文件复制到本地文件系统。从那里加载。以下假设库位于类路径上。
public void loadLibrary(String library) throws IOException {
InputStream source = getClass().getResourceAsStream(library);
File tempFile = File.createTempFile("javatmp", ".dll");
FileOutputStream dest = new FileOutputStream(tempFile);
try {
IOUtils.copy(source, dest)
}
finally {
dest.close();
source.close();
}
System.load(tempFile.getAbsolutePath());
tempFile.delete();
}
如果您无法更改库加载 DLL 的方式,则可以修改 PATH(使用JNA)并将 DLL 复制到该位置。以下假设库位于类路径的根目录上。
public void exposeLibrary(String library, File tempDir) throws IOException {
InputStream source = getClass().getResourceAsStream(library);
File tempFile = new File(tempDir, library);
FileOutputStream dest = new FileOutputStream(tempFile);
try {
IOUtil.copy(source, dest)
}
finally {
dest.close();
source.close();
}
WinLibc.INSTANCE._putenv("PATH=" +
System.getenv().get("PATH") + File.pathSeparator + tempDir.getAbsolutePath());
// After this point System.loadLibrary(library) will load the DLL.
}
public interface WinLibC extends Library {
static WinLibC INSTANCE = Native.loadLibrary("msvcrt", WinLibC.class);
public int _putenv(String name);
}
注意:我没有测试任何这些。第二种解决方案不适用于 Linux(但可以进行一些更改。)