Фон
Таким образом, я пытаюсь загрузить 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());
Я получаю следующее исключение при попытке использовать API JOGL:
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, который вызывается во времени выполнения?
Jogl всегда пытается автоматически загрузить все зависимые библиотеки. Чтобы избежать этого, должен быть класс NativeLibLoader, в котором вы можете вызвать disableLoading ( ) перед загрузкой библиотек самостоятельно через System.load ()
System.load (...)
принимает имя библиотеки в качестве аргумента. Путь к библиотеке не используется в качестве аргумента.
JVM ищет библиотеку с указанным именем в списке путей, указанных в -Djava.library.path;
Здесь нет ничего специфического для Mac OS X. Он ищет библиотеки одинаково во всех операционных системах.
Вам не обязательно предоставлять java.library.path
при запуске. Вы можете программно задать его с помощью
System.setProperty("java.library.path", "/var/folder/bla/foo/bar/");
Не знаю, будет ли System.load()
как-то работать без этого пути к библиотеке.