Mac Java 11 vs Java 8 dylib dlopen 错误:无法加载 libzstd.1.dylib

sig*_*ise 7 java java-native-interface dylib java-8 java-11

我有一个 libhadoopzstd.dylib,它是 JNI Hadoop ZSTD 实现的一部分。

libhadoopzstd.dylib包含对第二个 dylib 的 dlopen 调用libzstd.1.dylib- 假定在本地可用。

在 Java 8 (AdoptOpenJdk 1.8.0.211) 上一切正常。使用 Java 11 (AdoptOpenJdk 11.0.8) 编译器和 Java 11 运行时运行相同的代码会导致以下错误:

Error loading zstandard native libraries: java.lang.InternalError: Cannot load libzstd.1.dylib (dlopen(libzstd.1.dylib, 9): image not found)!
Run Code Online (Sandbox Code Playgroud)

我已经确认libzstd.1.dylib存在于/usr/local/lib. 我还尝试在运行 java 程序时明确指向LD_LIBRARY_PATHjava.system.path指向 libzstd dylib。

我已经在原始 C 代码中插入了打印语句,并重新编译了libhadoopzstd.dylib以尝试找出dlopen正在搜索dylib文件的路径。奇怪的是LD_LIBRARY_PATHDYLD_FALLBACK_LIBRARY_PATHJAVA_LIBRARY_PATH都显示为nulllibhadoopzstd.dylib.

由于唯一的区别是 Java 版本,我认为 Java 11 正在做一些与 Java 8 不同的路径。有谁知道这是否属实?

此外,有谁知道dlopen从 JVM 中运行时会搜索哪些路径?以及如何证实这一点?