Почему 2 пути для загрузки библиотеки JNA - PullRequest
1 голос
/ 22 апреля 2020

Здравствуйте. Это мой код:

if (isWindows()) {
            //System.setProperty("jna.library.path", getClass().getResource("/resources/win32-x86").getPath());//netbeans WinOs
                        System.setProperty("jna.library.path", System.getProperty("user.dir").toString()+File.separator+"Desktop");//compiler WinOs
        } else if (isMac()) {
            //System.setProperty("jna.library.path", getClass().getResource("/resources").getPath());//netbeans MacOs
                        System.setProperty("jna.library.path", System.getProperty("user.dir").toString()+File.separator+"Desktop");//compiler MacOs
        } else {
            System.out.println("Your OS is not support!!");
        }

Почему у меня 2 PATH (не понимаю, потому что для добавления изображения у меня есть только один путь) в ОС, один для использования с IDE, а другой для использовать с .JAR?

Я только что понял, что когда я использую windows и я запускаю проект (из netbeans), загружается «Библиотека», и я получаю информацию, но когда я компилирую и запускаю свой .jar, я получить ошибку:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: %1 is not a valid Win32 application.

Моя структура

Это правильно?

На ма c работать только с этой командой: java -jar "/System/Volumes/Data/Users/hugoclo/NetBeansProjects/Prezauto/dist/Prezauto.jar" с терминала. Если нажать на банку, у меня появляется сообщение об ошибке: Не найдено ..... Извините за мой Engli sh,

1 Ответ

2 голосов
/ 23 апреля 2020

Может быть две причины "почему". Хотя Java является кроссплатформенным, JNA (который опирается на некоторый нативный код) обязательно должен вести себя по-разному в разных операционных системах. Особенно в случае загрузки DLL (Windows) или динамических c библиотек (OSX), вы не хотите смешивать и сопоставлять. Поскольку может быть возможно иметь dll с одинаковыми именами, скомпилированные для разных операционных систем, страница JNA Getting Started определяет стандартные местоположения для этих библиотек:

Сделайте вашу целевую библиотеку доступной к вашей Java программе. Есть несколько способов сделать это:

  • Предпочтительный метод - установить системное свойство jna.library.path для пути к вашей целевой библиотеке. Это свойство аналогично java.library.path, но применяется только к библиотекам, загруженным JNA.
  • Измените соответствующую переменную среды доступа к библиотекам перед запуском ВМ. Это PATH в Windows, LD_LIBRARY_PATH в Linux и DYLD_LIBRARY_PATH в OSX.
  • Сделайте вашу нативную библиотеку доступной на вашем пути к классам по пути {OS}-{ARCH}/{LIBRARY}, где {OS}-{ARCH} - канонический префикс JNA для нативных библиотек (например, win32-x86, linux -amd64 или darwin). Если ресурс находится внутри файла JAR, он будет автоматически извлечен при загрузке.

В вашем коде вы, похоже, пытаетесь сделать первый вариант (установка jna.library.path) в включить рабочий стол пользователя. Это хорошо для тестирования, не хорошо для производства, и, вероятно, причина, по которой ваш скомпилированный jar не может его найти. Кроме того, устанавливая эту переменную, вы перезаписываете любое предыдущее (по умолчанию) местоположение для нее. Если вы хотите go этот маршрут, вы должны скопировать сохраненное местоположение и затем добавить свой собственный дополнительный путь к нему.

Однако для кода, который вы будете распространять среди пользователей, вам не нужно полагаться на абсолютный путь к файлу. Гораздо лучше поместить библиотеку в стандартную относительную папку: путь resources (src/main/resources при использовании Maven), который будет доступен в вашем (или любом другом) пути к классам при выполнении. Кажется, это совпадает с закомментированной веткой Windows вашего кода, которая будет выглядеть в подкаталоге win32-x86 вашей папки resources.

Возможно, вы сказали своей IDE добавить что-то в classpath (чтобы он там работал), но если он не находится в стандартном месте, он может перестать работать в банке.

Я не конечно, почему ветка macOS вашего кода не помещает ресурсы в подкаталог darwin, но, вероятно, так и должно быть.

...