Я создал файл .dylib, который хочу загрузить с помощью JNI, и не могу заставить программу Java найти его.
Я программно проверил значение java.library.path, и оно было таким:
/Users/potato/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
Когда я поместил свой файл .dylib в одну из этих папок, моя программа Java обнаружила и без проблем загрузила файл .dylib, но когда я попытался изменить java.library.path, включив в него путь к папке на рабочем столе, и поместил файл .dylib на рабочий стол, программа не смог найти.
System.setProperty("java.library.path", "/Users/potato/Desktop:" + System.getProperty("java.library.path"));
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("winfnc");
output:
/Users/potato/Desktop:/Users/potato/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no winfnc in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
Любая идея, что я делаю неправильно? Есть ли способ заставить программу найти файл .dylib в любой папке, которую я хочу, или еще лучше в своем собственном файле .jar и успешно загрузить его?
Обновлено: один ответ предлагает решение, использующее командную строку, но я хотел бы иметь возможность запускать приложение, дважды щелкнув исполняемый файл .jar, и не беспокоиться о каких-либо технических деталях.
В Eclipse есть возможность добавить аргументы виртуальной машины, но они используются только при запуске программы из Eclipse, а не при непосредственном открытии исполняемого файла .jar.




java.library.path нельзя изменить изнутри программы. Вы можете установить это свойство, но его значение используется только при запуске ВМ и больше не считывается. Вы должны установить его с -D
Смотрите также мой ответ здесь: https://stackoverflow.com/a/51304696/2543253
Насколько мне известно, нет никакого способа добиться этого с вашим существующим кодом, то есть с использованием loadLibrary. Вам нужно будет добавить собственный лаунчер или скрипт для запуска. Но если вы измените свой код, чтобы найти библиотеку самостоятельно с любой логикой, которую хотите, а затем используете load с полным путем к библиотеке вместо loadLibrary, вам не понадобится java.library.path.
Я уже думал о таких вещах, как повторный запуск приложения с Runtime.exec() и аргументами виртуальной машины, как только программа открывается, был слишком занят обдумыванием умных решений и пропустил самое простое, лол.
Спасибо, консольная команда сработала. Однако я хочу отправить программу другим людям (не программистам), чтобы они могли легко использовать ее, не нуждаясь ни в чем, кроме исполняемого файла
.jar. Есть ли способ добиться этого?