В моем приложении Java используется библиотека DLL. Как я могу заставить его работать из файла JAR?
DLL находится в папке источников проекта. Я должен включить его в свой JAR, извлечь его во время выполнения (в том же каталоге jar) и загрузить его.
В моем приложении Java используется библиотека DLL. Как я могу заставить его работать из файла JAR?
DLL находится в папке источников проекта. Я должен включить его в свой JAR, извлечь его во время выполнения (в том же каталоге jar) и загрузить его.
Вы должны поместить dll в путь к вашей библиотеке (рекомендуется), прежде чем пытаться загрузить его. так что вам придется извлечь его из jar и скопировать в путь lib.
private void loadLib(String path, String name) {
name = System.mapLibraryName(name); // extends name with .dll, .so or .dylib
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = getClass().getResourceAsStream("/" + path + name);
File fileOut = new File("your lib path");
outputStream = new FileOutputStream(fileOut);
IOUtils.copy(inputStream, outputStream);
System.load(fileOut.toString());//loading goes here
} catch (Exception e) {
//handle
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
//log
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
//log
}
}
}
}
Примечание. ACWrapper
- это класс, содержащий статический метод.
try {
InputStream in = Main.class.getResourceAsStream("/example-input.dll");
File fileOut = new File("./example-output.dll");
DataOutputStream writer = new DataOutputStream(new FileOutputStream(fileOut));
long oneChar = 0;
while((oneChar = in.read()) != -1){
writer.write((int)oneChar);
}
in.close();
writer.close();
}
catch (Exception e) {
e.printStackTrace();
}