2

我在加载 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 运行时链接的工作方式有关吗?

我看到了很多解决方法,但首先想了解它的底线。

谢谢,米哈伊尔

4

0 回答 0