JNI,C++;及其标准库 我在java中通过JNI使用了一些C++代码。 C++代码使用LIPSTDC + +和LIbz的一些函数。 C++部分链接到共享库,而在不同的环境(基于Linux)上使用的是构建的库。

JNI,C++;及其标准库 我在java中通过JNI使用了一些C++代码。 C++代码使用LIPSTDC + +和LIbz的一些函数。 C++部分链接到共享库,而在不同的环境(基于Linux)上使用的是构建的库。,java,c++,java-native-interface,Java,C++,Java Native Interface,我关心的是libstdc++和libz版本的差异。如果我在环境A上构建了那个JNI库,然后它转到了环境B和C,而环境B和C可能有其他的libstdc++和libz版本,它会失败吗?这是否意味着我需要静态地将这些库链接到我的JNI共享库中 第一次测试了2个稍微不同的环境,但我仍然觉得不安全。 < P>这与C++的非JNI用法没有什么不同。一般来说,库提供者努力确保向后兼容性——所以在大多数情况下,您所关心的不是偶然发现一个太旧的版本 有几种常见的选择: 依靠打包来确保您的依赖关系的正确版本(例如,

我关心的是libstdc++和libz版本的差异。如果我在环境A上构建了那个JNI库,然后它转到了环境B和C,而环境B和C可能有其他的libstdc++和libz版本,它会失败吗?这是否意味着我需要静态地将这些库链接到我的JNI共享库中


第一次测试了2个稍微不同的环境,但我仍然觉得不安全。

< P>这与C++的非JNI用法没有什么不同。一般来说,库提供者努力确保向后兼容性——所以在大多数情况下,您所关心的不是偶然发现一个太旧的版本

有几种常见的选择:

  • 依靠打包来确保您的依赖关系的正确版本(例如,如果您在Linux上打包到RPM/DEB包中,则在包元数据中设置要求)。对于Mac,您通常针对标准库的特定操作系统版本,并将非标准库(libz)与安装程序捆绑在一起。我认为如果没有Cigwin之类的工具,默认情况下Windows上的libstdc++是不可能实现的
  • 静态链接
  • 将共享库与应用程序打包