我想将本机共享库打包到Java应用程序中(因此它成为JAR的一部分),以便通过JNI调用。
共享库(Linux)来自第 3 方并具有一些依赖项,大致如下所示:
$ readelf -d libpdalcpp.so.17.0.0
Dynamic section at offset 0xd9a4a0 contains 38 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libgdal.so.32]
0x0000000000000001 (NEEDED) Shared library: [libproj.so.25]
0x0000000000000001 (NEEDED) Shared library: [libgeotiff.so.5]
0x0000000000000001 (NEEDED) Shared library: [libxml2.so.2]
0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
...
我的问题是我不能(不想)保证这些依赖项在运行时可用;生成的 Java 应用程序将在基于某些(我不想关心哪个)Linux 发行版的 JRE 容器中运行。
所以我想要的是在构建时解决这些依赖关系,并将我的初始共享库与对其他共享库的依赖关系转换为对系统中其他共享库没有任何(或尽可能少)依赖关系的共享库。
最终这在实践中是不可能的:几乎所有 UNIX 系统都将共享库视为
链接产品,无法对其进行有意义的修改(除非以非常有限的方式进行修改)。