В проекте Java я использую стороннюю библиотеку, которая загружает некоторую нативную библиотеку через
System.loadLibrary("libName");
. Я бы хотел иметь возможность влиять на путь поиска этого метода из моего приложения., так что пользователю не нужно указывать правильное значение java.library.path в командной строке (это значение зависит от текущей ОС и архитектуры).Например, в Windows я хочу установить "lib / native / windows", в Linux 32bit - "lib / native / linux32" и т. Д.
Я пытался
System.setProperty("java.library.path", ...)
, но этоигнорируется, по-видимому, потому что JVM читает это свойство только один раз перед запуском моего кода.
Я также пытался загрузить собственный библиотека перед использованием библиотеки Java, которая зависит от него с помощью
System.load("fullPath/lib")
Этот вызов завершается успешно, но все еще будет UnsatisfiedLinkError, когда собственная библиотека снова загружается с помощью System.loadLibrary ().
Единственный найденный мной способ - это следующее:
- Добавитьинтерфейсы, которые абстрагируют весь API внешней библиотеки.
- Используйте только эти интерфейсы в остальной части кода.
- Добавьте классы, которые реализуют интерфейсы, и делегируйте библиотеке.
- Напишите собственный ClassLoader, который
- перезаписывает findLibary () так, чтобы собственная библиотека находилась по правильному пути
- перезаписывает loadClass () и загружает все классы внешней библиотекии слой-обертка сам по себе вместо попытки делегировать его родителю, как если бы ClassLoader по умолчанию делал бы
- Убедитесь, что интерфейсы загружены с обычным ClassLoader и классами обертывания и внешней библиотекойзагружаются с моим собственным ClassLoader.
Это работает, но я нахожу это очень сложным и требует больших усилий, потому что мне нужно добавить все эти интерфейсы.Есть ли более простой способ?