Загрузка библиотеки JNI в Mac OS X?

Фон

Итак, я пытаюсь загрузить jnilib (в частности, JOGL) в Java на Mac OS X во время выполнения . Я слежу за соответствующими вопросами о переполнении стека:

Конечная цель для меня - упаковать файлы JOGL для конкретной платформы в JAR, разархивировать их во временный каталог и загрузить при запуске. Я вернулся к своей проблеме, просто попытавшись загрузить JOGL, используя жестко запрограммированные пути:

    File f = new File("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl.jnilib");
    System.load(f.toString());
    f = new File ("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl_awt.jnilib");
    System.load(f.toString());

Я получаю следующее исключение при попытке использовать JOGL API:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path

Но когда я указываю java.library.path, добавляя следующую опцию JVM:

    -Djava.library.path="/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/" 

Все нормально работает.


Вопрос

Можно ли использовать System.load (или какой-либо другой вариант) в Mac OS X в качестве замены -Djava.library.path, который вызывается во время выполнения?


person Clinton    schedule 31.03.2010    source источник


Ответы (3)


Jogl всегда пытается автоматически загрузить все зависимые библиотеки. Чтобы этого избежать, должен быть класс NativeLibLoader, в котором вы можете вызвать disableLoading (), прежде чем загружать библиотеки самостоятельно через System.load ()

person momania    schedule 03.04.2010
comment
Сладкий! Спасибо за это, вызов NativeLibLoader.disableLoading () перед загрузкой библиотек вручную сработал блестяще. - person Clinton; 06.04.2010

Вам не нужно указывать java.library.path при запуске. Вы можете программно установить его с помощью

System.setProperty("java.library.path", "/var/folder/bla/foo/bar/");

Не знаю, будет ли System.load() работать как-нибудь без этого пути к библиотеке.

person David Sauter    schedule 31.03.2010
comment
Спасибо за предложение. Однако, по моему опыту, установка java.library.path во время выполнения не имела никакого эффекта. Я думаю, что это может быть по тем же причинам, что и вы не можете изменить путь к классам во время выполнения - stackoverflow.com/questions/271506/ - person Clinton; 06.04.2010
comment
Тогда у вас могла быть другая проблема с зависимой библиотекой. Установка пути к библиотеке во время выполнения работает отлично, я раньше загружал свои библиотеки именно так. - person David Sauter; 06.04.2010
comment
Это не совсем так, есть способ принудительно повторно инициализировать загрузчик классов с новым lib.path. - person Zorkus; 22.12.2011
comment
Сделайте что-нибудь вроде этого: System.setProperty (java.library.path, newPath); Поле fieldSysPath = ClassLoader.class.getDeclaredField (sys_paths); fieldSysPath.setAccessible (истина); fieldSysPath.set (ноль, ноль); - person Zorkus; 22.12.2011

System.load(...) принимает имя библиотеки в качестве аргумента. Путь к библиотеке не используется в качестве аргумента. JVM ищет библиотеку с указанным именем в списке путей, указанных в -Djava.library.path;

Здесь нет ничего специфичного для Mac OS X. Он ищет библиотеки одинаково во всех операционных системах.

person Santhosh Kumar Tekuri    schedule 31.03.2010
comment
на самом деле это неверно, System.load () примет полное имя файла, а System.loadLibrary - имя библиотеки - person sreejith; 31.03.2010
comment
Я думаю, что загрузка jnilib зависит от Mac (в моем случае). У меня он работает на Linux (.so), в Mac после компиляции jnilib не загружается. Я использую mvn jetty: deploy-war -Djava.library.path = / path / to / jnilib. Я даже использовал System.setProperty (mylib.systemclassloader, false); чтобы он работал в среде сервлета (он отключает автоматическую загрузку этой библиотеки). В чем может быть причина? - person Pramod; 16.12.2011