0

我在 Java 中通过 JNI 使用一些 C++ 代码。C++ 代码使用了一些来自 libstdc++ 和 libz 的函数。C++ 部分被链接到一个共享库中,并且构建的库用于不同的环境(基于 Linux)。

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

PS 2 个略有不同的环境的第一次测试成功,但我仍然觉得这里不安全。

4

1 回答 1

2

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

有几个常见的选项:

  1. 依赖打包来确保您的依赖项的正确版本(例如,如果您在 Linux 上打包成 RPM/DEB 包,则在包元数据中设置要求)。对于 Mac,您通常针对标准库的特定操作系统版本并将非标准库 (libz) 与安装程序捆绑在一起。我不认为你可以在默认情况下在 Windows 上期望 libstdc++,没有 Cigwin 和喜欢。
  2. 静态链接。
  3. 将共享库与您的应用程序打包在一起。
于 2013-08-26T18:58:44.633 回答