Извлечь и загрузить DLL из JAR

В моем приложении Java используется библиотека DLL. Как я могу заставить его работать из файла JAR?

DLL находится в папке источников проекта. Я должен включить его в свой JAR, извлечь его во время выполнения (в том же каталоге jar) и загрузить его.

Ответ 1

Вы должны поместить 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 - это класс, содержащий статический метод.

Ответ 2

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();
}