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

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

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


person Oneiros    schedule 21.01.2011    source источник


Ответы (1)


Вам необходимо поместить dll в путь к вашей библиотеке (рекомендуется), прежде чем вы попытаетесь ее загрузить. так что вам нужно будет извлечь его из jar и скопировать в путь к библиотеке.

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

person jmj    schedule 21.01.2011
comment
Компилятор не может найти FileUtils и IOUtiles - person Oneiros; 22.01.2011
comment
вам нужно добавить commons-io jar в вашем пути к классам - person jmj; 22.01.2011
comment
System.getProperty("java.library.path"); // для выигрышной машины помню ее C:\\windows\\system32 - person jmj; 22.01.2011
comment
Я получаю исключение в основном потоке java.lang.UnsatisfiedLinkError: нет j3dcore-ogl в java.library.path :( - person Oneiros; 22.01.2011
comment
это просто означает, что dll не была извлечена по пути к библиотеке. - person jmj; 22.01.2011
comment
Код работает ..! попробуй выяснить, что не так. , 1. вы делаете ошибку при передаче аргумента. 2. вы не копируете в нужное место 3. код работает протестирован. - person jmj; 22.01.2011
comment
InputStream in = Frame3D.class.getResourceAsStream (/dll/j3dcore-ogl.dll); Файл fileOut = новый файл (System.getProperty (java.library.path)); OutputStream out = FileUtils.openOutputStream (fileOut); Не вижу, что случилось ... - person Oneiros; 22.01.2011
comment
System.getProperty("java.library.path") он вернет много путей. просто выберите стандартный и напишите туда свой файл, - person jmj; 22.01.2011
comment
хорошо, теперь он работает ... но только если я запустил его с терминала! :( если я запустил банку, дважды щелкнув по ней, она зависает после загрузки dll без выдачи исключений ... omg - person Oneiros; 22.01.2011
comment
Попробуйте из командной строки java -jar jarName.jar .. проверьте, есть ли исключения. попробуйте запустить jar из командной строки из того же DIR, где он находится - person jmj; 22.01.2011
comment
да, это работает, если я запускаю эту команду из командной строки, без каких-либо исключений ... и это работает также, если я запускаю ее из netbeans :) я не понимаю, почему ... это простой HelloWorld с использованием 3D-библиотек. .. все равно большое спасибо, Джигар! : D - person Oneiros; 22.01.2011
comment
решено ^^ stackoverflow.com/questions/4775487 / - person Oneiros; 23.01.2011