ライブラリのロードコードを変更できる場合: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をロードする方法を変更できない場合は、(JNAを使用して)PATHを変更し、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);
}
注:私はこれをテストしていません。2番目のソリューションはLinuxでは機能しません(ただし、いくつかの変更を加えることで機能する可能性があります)。