У меня есть библиотека, от которой зависит мой JNI, я хотел бы, чтобы она загружалась относительно пути к классам, возможно ли это?
По отношению к classpath
нет, это не возможно — библиотеки, в том числе .jnilib
следуйте пути поиска ОС, определенному на основе того, что назначает JRE, и того, что упоминают сами библиотеки.
Когда вы делаете .jnilib
Вы можете добавить флаг компоновщика, чтобы указать rpath относительно пути к «загрузчику» для библиотеки, что позволит вам размещать зависимые библиотеки в расположении рядом с .jnilib
сам, который может выполнить подобное поведение:
libjni.jnilib: libjni.o
$(CC) -o $@ $< -Wl,-rpath,@loader_path/../lib
Важным пунктом является добавление -Wl,-rpath,@loader_path/../lib
— который говорит скажите компоновщику, чтобы добавить @loader_path/../lib
к rpath
из .jnilib
,
Значение @loader_path
решает к месту расположения .jnilib
файл во время выполнения.
Если вы хотите загрузить зависимости, основанные на пути к классам, вам на самом деле придется найти библиотеки, основанные на пути к классам, и явно загрузить их в JRE, используя System.load()
и затем они должны быть предварительно разрешены командой dyld при загрузке библиотеки, от которой зависит модуль.