Java, загрузить нативную библиотеку внутри classpath - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть следующий дистрибутив

.__bin
|   |__start.sh
|
|__lib
    |__Main.jar
    |__Utility.jar
    |__lib.so

Main.jar содержит метод main, в котором я хотел бы получить доступ к собственным функциям, предоставляемым lib.so в комплекте поставки. start.sh просто устанавливает classpath и начальной загрузки java.

Каков наилучший подход для загрузки библиотеки lib.so внутри приложения?Мне известны два метода:

  • System.load ( абсолютный путь )
  • System.loadLibrary ( имя )

Для прежнего требуется абсолютный путь к библиотеке в файловой системе, для последнего требуется установить специфический для приложения java.library.path аргумент JVM.Какое решение лучше в этом случае?Может ли установка пути к библиотеке в скрипте start.sh что-то сломать?Как я могу получить абсолютный путь к файловой системе библиотеки для первого решения?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Для метода load() требуется полный путь к библиотеке в качестве аргумента.Например, в системе Solaris вы можете написать:

System.load("/home/me/libs/libmylib.so");

, чтобы загрузить библиотеку libmylib.so в каталог /home/me/libs.

Использование load() Метод является системно-зависимым, поскольку он использует pathname для загрузки библиотеки, а имена путей обычно зависят от системы.Таким образом, loadLibrary() иногда является лучшим выбором.Однако динамически загружаемые библиотеки по своей природе зависят от системы, поэтому использование load() не может поставить под угрозу независимость системы, равно как и сам процесс загрузки библиотеки.

Для метода loadLibrary() требуется только имяa для загрузки:

System.loadLibrary("mylib");

Метод loadLibrary() ищет библиотеку.Поиск, выполняемый loadLibrary(), зависит от системы, в которой вы работаете, но обычно он выполняет поиск в каталогах, перечисленных в одной из переменных среды, установленных для этой цели.

Вы можете явно указать свой абсолютный путь.

Помимо системной независимости, нет никаких реальных различий в плане безопасности.

Ссылки :

1) https://security.stackexchange.com/questions/35724/security-implications-of-javas-system-load-vs-system-loadlibrary

2) https://www.chilkatsoft.com/java-loadLibrary-Linux.asp

0 голосов
/ 19 сентября 2018

Если я ничего не пропустил, разве настройка System.load не лучший подход?Ваш lib.so не изменится, так как он есть в вашей структуре.Если вы хотите передать контроль конечному пользователю, чтобы он загружал нативную / разделяемую библиотеку из другого места, укажите необязательный параметр в start.sh.Еще используйте System.load (). Просто проверьте тип ОС, так как у вас будут разные форматы для путей к файлам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...