我有一个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
添加到.jnilib
的rpath
。
值@loader_path
解析为运行时.jnilib
文件的位置。
如果你想基于类路径加载依赖项,你实际上必须自己找到基于类路径的库,并使用System.load()
显式地将它们加载到jre中,然后当你加载模块所依赖的库时,dyld应该预先解析它们。