У меня следующая раздача
.__bin
| |__start.sh
|
|__lib
|__Main.jar
|__Utility.jar
|__lib.so
Main.jar содержит основной метод, в котором я хотел бы получить доступ к собственным функциям, предоставляемым lib.so, включенным в дистрибутив. start.sh просто устанавливает путь к классам и загрузку java.
Как лучше всего загрузить библиотеку lib.so внутри приложения? Мне известны два метода:
Прежний требует абсолютного пути к библиотеке в файловой системе, последний требует установки аргумента JVM java.library.path для конкретного приложения. Какое решение лучше в этом случае? Может ли установка пути к библиотеке в сценарии start.sh что-нибудь сломать? Как я могу получить абсолютный путь к файловой системе библиотеки для первого решения?




Предполагая, что я ничего не упускаю, разве установка System.load не является лучшим подходом? Ваш lib.so не изменится, поскольку он у вас есть в вашей структуре. Если вы хотите предоставить конечному пользователю возможность загружать родную / общую библиотеку из другого места, укажите в start.sh необязательный параметр. В противном случае используйте System.load (). Просто не забудьте проверить тип ОС, так как у вас будут разные форматы для путей к файлам.
Метод 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(), зависит от системы, в которой вы работаете, но обычно он ищет каталоги, перечисленные в одной из переменных вашей среды, настроенных для этой цели.
Вы можете явно указать свой абсолютный путь.
Помимо системной независимости, с точки зрения безопасности нет никаких реальных различий.
использованная литература: