我在加载 2 个库时遇到了一些问题,其中一个库在 Linux 中依赖于另一个库。假设我有 2 个库,libA.so 和 libB.so,libB.so 依赖于 libA.so(从中调用函数)。
我需要通过 JNI 从 Java 加载 libB.so 并从中调用一些本机方法。
所以我想做的是:
static {
System.loadLibrary(A);
System.loadLibrary(B);
}
(两个库都驻留在 java.library.path 中)。
在 Win32 下,它工作正常 - B.dll 看到 A.dll 已经加载,并且不会尝试自己加载它(使用 PATH 查找)。
在 Linux 上,它不起作用。额外的日志显示, System.loadLibrary(A); 正确执行,并且 libA.so 加载正常,然后,当我们尝试加载 B 时,它在 LD_LIBRARY_PATH 中查找库 libA.so,但失败(两个库都在 java.library.path 中,但不在LD_LIBRARY_PATH)。
有人为什么会这样吗?它与 Linux 运行时链接的工作方式有关吗?
我看到了很多解决方法,但首先想了解它的底线。
谢谢,米哈伊尔