2023-01-19 369
Java本机界面(JNI)是否受C ++ ABI兼容性问题?
我正在开发Java应用程序.我想使用Java本机接口(JNI)在C ++库中调用函数.我可以访问C ++库的代码,我可以重建它,但可能需要. (例如,我可以静态地链接C ++运行时.)
我可以要求我的用户拥有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是前向兼容的.”那成功了吗?
我感谢有关这些问题的任何指导. (嘿,感谢您阅读所有这些!)
编辑
我的问题越来越长,所以我没有提供所有细节.解决威尔的评论:
我不知道.但这永远不会阻止我.
首先,这取决于您想做什么. 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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态