Java本机界面(JNI)是否受到C ++ ABI兼容性问题的影响?

 2023-01-19    369  

问题描述

Java本机界面(JNI)是否受C ++ ABI兼容性问题?

我正在开发Java应用程序.我想使用Java本机接口(JNI)在C ++库中调用函数.我可以访问C ++库的代码,我可以重建它,但可能需要. (例如,我可以静态地链接C ++运行时.)

Java本机界面(JNI)是否受到C ++ ABI兼容性问题的影响?

我可以要求我的用户拥有6个或更高的JRE,但是我不能要求他们具有任何特定的C ++运行时.

一个同事向我指出了这篇博客文章: http://www. trilithium.com/johan/2005/06/static-libstdc/建议不要使用动态加载的C ++代码.

另一个同事向我指出了此错误报告: http://bugs.sun .com/bugdatabase/view_bug.do?bug_id = 4694590 哪些详细介绍了如何在Java 1.4.2中解决这些问题.

我了解的问题的要点是,libstdc ++的二进制接口经常改变.如果C ++应用程序加载了使用其他编译器构建的C ++共享库,则将两个不兼容的LibstDC ++库同时加载到内存中.

错误报告解释了Java 1.4.2的解决方案:”我们从静态地链接JDK中的C ++运行时,启用的链接器脚本将符号隐藏在libstdc ++和其他内部符号中.结果,结果,这些符号对JNI代码来说是看不见的,当某些本机代码需要调用C ++运行时,将使用适当的libstdc ++解决该调用.因此,仍然有两个libstdc ++.因此,同时加载,但应该是良性的.”

>

我对此有一些问题.

首先,OpenJDK是否继续采用这种方法?

[编辑:我在OpenJDK的build-dev邮件列表上问了这个问题.答案是肯定的,热点仍在静态地链接libstdc ++,但显然”大多数Linux发行版将其解决”.另一位开发人员指出,这甚至不需要补丁:”设置
static_cxx = false应该足够(默认为true).”]

第二,即使在这种情况下,有两个不兼容的libstdc ++.同时加载?

第三,这种方法(将符号隐藏在JDK中)是否解决了所有兼容性问题?

上面引用的博客文章警告说:”针对不同ABI的代码根本不兼容二元.”后来,”语言运行时支持通常依赖于共享的某些数据,例如访问某种锁定或全局数据结构(类似于C程序需要共享的ERRNO).”

>

这听起来像是无法解决问题.

然后,也许ABI不兼容不再是问题.博客文章已有六年历史了.另一个stackoverflow问题的一个答案( gcc abi兼容性)自从GCC-3.4.0起, ABI是前向兼容的.”那成功了吗?

我感谢有关这些问题的任何指导. (嘿,感谢您阅读所有这些!)

编辑

我的问题越来越长,所以我没有提供所有细节.解决威尔的评论:

  1. 我只需要调用Extern” C”功能. (例如,我使用Javah生成C标头文件.)
  2. 我不需要与JVM中的C ++运行时进行交互. (我基本上只需要将字符串发送到C ++库.)

推荐答案

我不知道.但这永远不会阻止我.

首先,这取决于您想做什么. JDK静态链接的前提是改善实际JDK本身的可移植性.由于他们不能期望用户将JDK重新编译在其特定操作系统上,因此他们需要一种机制来制造最终的二进制便携式.显然静态链接已解决此问题.

接下来,关于JNI,首先您将调用C函数而不是C ++,我不相信JNI具有任何C ++绑定.因此,您要使用的任何C ++都需要包装在C例程中与Java交谈.

接下来,您的C ++ .SO将与OS的动态链接,就像我猜想的正常一样.似乎很严厉,希望JNI例行程序不使用动态链接.而且,毫无疑问,C ++像它一样受欢迎,似乎也无法动态地与C ++ .SO进行动态链接.因此,无论需要采取任何促进这一点的恶作剧,这是一个合理的假设,即他们(TM)已经完成了这项工作以实现这一目标.

也就是说,当然不期望您使用的任何C ++都会与Java运行时的C ++运行时进行任何互动.理想情况下,他们将简单地和平共存.

鉴于,假设您的C ++肯定会遇到ABI可移植性问题,因为它会动态链接,并且会受到OS’ES安装的C ++运行时的怜悯.

.

所以,最后,我只是给它撕裂,看看会发生什么.

以上所述是小编给大家介绍的Java本机界面(JNI)是否受到C ++ ABI兼容性问题的影响?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25769.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。