Как загрузить библиотеку, которая зависит от другой библиотеки, все из файла JAR - PullRequest
6 голосов
/ 04 июня 2010

Я хотел бы отправить свое приложение в виде отдельного файла JAR. Файл jar должен содержать все файлы классов, а также две общие библиотеки. Одна из этих общих библиотек написана для JNI и по сути является косвенной к другой (что составляет 100% C).

Сначала я попытался запустить файл JAR без библиотек, но доступ к ним осуществлялся через переменную среды LD_LIBRARY_PATH. Это работало нормально.

Затем я помещаю библиотеку JNI в файл jar. Я читал о загрузке библиотек из jar-файлов, сначала скопировав их во временный каталог, и это хорошо сработало для меня (обратите внимание, что библиотека 100% C была загружена, как и раньше).

Теперь я хочу поместить обе библиотеки в банку, но я не понимаю, как убедиться, что они будут загружены. Конечно, я могу скопировать их оба во временный каталог, но когда я загружаю «косвенный», он всегда дает мне:

java.lang.UnsatisfiedLinkError: /tmp/.../libindirect.so: /libpure.so: невозможно открыть общий объектный файл: такого файла или каталога нет

Я пытался заставить JVM сначала загрузить библиотеку "100% C", явно вызвав System.load (...) для своего временного файла, но это не сработало лучше. Я подозреваю, что система ищет его при разрешении ссылок в libindirect.so, но не заботится о том, что загрузила JVM.

Может ли кто-нибудь помочь мне в этом?

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 июня 2010

Одним из способов было бы порождение другого процесса Java из первого, генерируя соответствующий скрипт вызова.

  1. Банку вызывает пользователь
  2. Библиотеки извлекаются во временный каталог
  3. Скрипт (bash) записывается во временный каталог
    • устанавливает / экспортирует необходимые переменные окружения
    • запускается второй экземпляр JRE
  4. Код делает скрипт исполняемым
  5. Код вызывает скрипт

Я знаю, что создание двух экземпляров JRE для запуска одного приложения также не будет моим первым выбором.

0 голосов
/ 30 апреля 2015

Если вы используете Eclipse IDE, этот ответ может вам помочь.

У меня была такая же проблема в окнах затмения, что я не мог добавить зависимые файлы .class из JNI. Некоторое время спустя я обнаружил, что "Это известная ошибка в Eclipse" . Чтобы устранить эту проблему, я перенес весь код в IDE NetBeans.

Невозможно добавить все файлы классов из папки JNI в Eclipse (JAVA, Windows 7)

...