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

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

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

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

另一位同事指出了这个bug报告: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 .so来解析,同时还有两个libstdc .so正在加载,但它应该是良性的.

我有几个问题.

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

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

其次,即使在这种情况下,同时加载两个不兼容的libstdc .so真的是有道理的吗?

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

上面提到的博客文章警告说,“针对不同ABI编译的代码根本不是二进制兼容的.”此后,“语言运行时支持通常依赖于一些共享数据,例如访问某种锁或全局数据结构(类似于C程序需要共享的错误).

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

那么再一次,也许ABI不兼容不再是问题了.博客文章超过六年.另一个stackoverflow问题的答案(GCC ABI compatibility)断言“由于gcc-3.4.0,ABI是向前兼容的.”有没有成功?

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

EDITS

我的问题变得很长,所以我没有给出所有的细节.要解决Will的意见:

>我只需要调用extern“C”函数. (例如,我使用javah生成C头文件.)
>我不需要与JVM中的C运行时交互. (我基本上只需要将字符串发送到C库.)

解决方法

我不知道.但是从来没有阻止我.

首先,这取决于你想做什么. JDK的静态连接背后的前提是提高实际JDK本身的可移植性.由于他们不能期望用户在其特定的操作系统上重新编译JDK,所以需要一种机制,使最终的二进制可移植.显然静态链接解决了这个问题.

接下来,关于JNI,首先你会调用C函数而不是C,我不相信JNI有任何类型的C绑定.所以,无论你想要使用什么C都需要被包装在C程序中以与Java进行交流.

接下来,C .so将动态地链接到操作系统,就像我正在猜测的一样.期望JNI例程不能与动态链接的操作似乎很恶劣,而C .so应该没有什么不同.而且,毫无疑问,C是如此受欢迎,似乎也是恶劣的,你将无法动态地链接到C .so.那么,无论是为了促进这一点而需要发生什么样的人,这是一个合理的假设,他们(tm)已经做了这样的工作来实现这一点.

也就是说,您一定不会期望任何C使用的都将与Java运行时的C运行时进行任何交互.理想情况下,它们只会和平共存.

鉴于这一点,假设这一切都有效,您的C将绝对会有ABI可移植性问题,因为它将是动态链接,并将受到OS安装的C运行时的怜悯.

所以,最后,我会给它一个裂缝,看看会发生什么.

Java本机接口(JNI)是否受到C ABI兼容性问题的影响?的更多相关文章

  1. Swift ABI 稳定时间将被推迟,新版本 iPhone 可能包括双镜头相机

    新闻SwiftABI的稳定时间将被推迟:在之前Swift3.0的路线图中,新版本的Swift预计可以达到ABI稳定,这将意味着旧版本的Swift二进制程序将可以运行在新的环境中。通用的ABI和其稳定性将被移到之后的版本中实现。下一代大屏iPhone可能配备双镜头:随着夏天的到来,上一代的iPhone也进入了销售的中期。和以往一样,关于今年iPhone的种种传言和猜测也逐渐开始流行。据称Apple将可能在下一代的5.5寸iPhone上安装两个背面镜头。

  2. 【译】回顾Swift 3, 展望Swift 4

    原文:LookingbackonSwift3andaheadtoSwift4作者:ChrisLattner译者:kemchenj大家好,Swift3的正式版已经接近完成状态了,是时候来回顾一下发布之前的事情,从中汲取经验,并且用来整理一下我们(Swift社区)在今年做的事情了.总的来说,Swift3无疑将会是一个Amazing的版本,我们做到的很了不起,谢谢每一个为这件事情贡献力量的人.比起马上推

  3. 译:Swift ABI (一)

    作为Swift社区的一份资源,这份文档也为SwiftABI的发展指明了方向。这些内容记录了和SwiftABI相关的工程和设计任务。在运行时,通过Swift编写的二进制程序通过ABI和其他的程序库或组件进行交互。但Swift是一门和C截然不同的语言,它需要为每一种平台定义自己的ABI。而这份文档中中的绝大部分内容都是和平台无关的,和具体平台相关的考量会影响到SwiftABI的设计和实现细节。

  4. 译:Swift ABI (二)

    为了达成二进制层次上的交互,它们必须共享相同的布局协议。为了把它们表达成一个全局唯一的名字,Swift使用了一种叫做namemangling的技术。因此,Swift运行时API也是SwiftABI的一部分。为了让这份自带的标准库可以被用不同版本Swift编写的程序调用,标准库也需要对外暴露一份稳定的API。关于标准库ABI的稳定性会在标准库的章节中进行讨论。

  5. android – Carousel中的ArrayIndexOutOfBoundsException – MessageQueue回调和handleReceiveCallback中的异常

    我在我的应用程序中使用轮播.对于拥有Android4.2.2且仅在横向模式下的用户,他们报告此问题:我无法在这里找到问题所在.解决方法看起来您将视图存储在数组中.旋转设备时,将重置此阵列并删除所有视图.当数组适配器尝试获取其位置时,因为该数组为空,所以它返回-1.尝试处理旋转事件并确保重新填充数组.我没有看到一些代码就无法回答,但它看起来像是清空或设置为null的视图数组/列表.

  6. Android NDK调试:armeabi-v7a无法正常工作

    或者我错过了什么?解决方法我遇到过同样的问题.我在本文后面配置了eclipse:http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/然后我从armeabi变为armeabi-v7a.然后我无法调试.我解决了这个问题:1)您必须修复“调试配置”中的文件夹>主标签更改…obj/local/armeabi-v7a/app_process>调试器选项卡更改…

  7. android – JNI:如何获得jbyteArray大小

    背景我正在使用JNI中的字节数组.而且我无法获得jbyteArray的长度.我正在Windows7中的eclipse中编写代码.Java代码:JNI代码:在JNI中,我有一个结构,它有两个成员无符号长度和无符号字符数据[1]现在我的JNI函数得到参数jbyteArrayjpSeed我想得到jpSeed的长度并将其设置为struct的length成员.问题1:如何在JNI中获得jpSeed的长度?问题2:此代码是否正常bd.data[1]=jbyteArray;?

  8. Android JNI中的高精度计时器

    我正在尝试描述我的JNI应用程序.是否有类似“自启动后获取刻度”的东西,我可以用来衡量功能和/或系统?

  9. Butterknife 8.1.0在Android Studio 2.1.2中不能与JDK 1.8一起使用

    如果是,我需要做些什么才能使其正常工作?

  10. android-studio – 安卓工作室更新后的问题

    解决方法我在AndroidStudio中花了很多时间来处理这个问题.看来这个问题是由用于编译项目的java版本的差异引起的.最后,在“项目结构”设置窗口中,我在SDK位置选项卡中启用了“使用嵌入式JDK(推荐)”.并快乐编译:)

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部