阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

JNA 将原生码注入 JRuby

  • 2007-09-11
  • 本文字数:1525 字

    阅读完需:约 5 分钟

JRuby 的一个大问题将在不久以后得到解决:对POSIX支持的整合和原生扩展的支持(native extension support)将很快与大家见面。 POSIX 代表可移植操作系统接口(Portable Operating System Interface),是一组标准协议。除此之外,它还提供访问文件系统或网络的接口 API。这一功能将使和操作系统的整合更为紧密,至少是和操作系统的 POSIX 整合同样紧密。

迄今为止,支持 POSIX 调用一直是 JRuby 的一个大难题。使用 Java 中的 API 是一个办法,不过即使是 Java 当中存在能够完成类似功能的接口,语义方面也可能存在问题。 并且如果 Java 平台缺少这个功能,剩下的唯一补救办法就是打开一个命令行窗口,然后执行程序来完成任务。

JRuby 团队的 Charles Nutter在他的 Blog 中对原生码和 POSIX 有如此描述

我知道,我知道,它包含原生码,那很糟糕。它使用了 JNI,同样非常糟糕。不过,我想我这辈子也不会看到使用 JNA 带来的不好之处会超过它带来的那些不可思议的好处。举个例子,在我刚刚提交的新的 POSIX 接口中:import com.sun.jna.Library;<p> public interface POSIX extends Library {</p><br></br>   public int chmod(String filename, int mode);<br></br>   public int chown(String filename, int owner, int group);<br></br> }

这里的“秘密武器”(也许已经不是什么秘密了)就是 Java Native Access(JNA库,不要将它和 Java 的JNI库相混淆,JNI 提供访问原生 C 代码的支持,这需要一些额外的工作和一些“粘合代码(glue code)”,比如需要编译的 JNI 头文件定义。

对于上边的例子,以下使用 JNA 的代码就是载入和访问所需库的全部代码:

import com.sun.jna.Native;<br></br>POSIX posix = (POSIX)Native.loadLibrary("c", POSIX.class);以上代码载入了 C 库,并且能够访问chmod(改变文件访问权限)和chown(改变文件的所属人)命令。当然这种方式的访问并不仅仅局限于这两个命令。通过向POSIX接口添加更多的功能,我们可以访问更多的 C 标准库的功能。毕竟,现阶段的Native.loadLibrary只是试图将 Java 接口中的方法名和 C 库中的相应函数名匹配,并使其可以访问。

JNA的底层仍旧通过 JNI 来访问 libffi 库,实现其所有功能。使用 JNI 会带来一些副作用,比如会和一些不兼容的安全管理程序发生冲突,在和 J2EE 容器一起使用的时候也可能出现问题。

显然,当原生库发布的时候,需要适应各种平台。当前可用的 JNA 版本就包含了专门为 Win32、Linux 32 位及 64 位 x86 版本、Solaris SPARC 和 x86 版本、FreeBSD,以及 Darwin(MacOS X)的 PPC 和 x86 各种平台编译的库。

能够方便地从 JRuby 访问原生库是很有用的,不过 JNA 开启了另一种可能性:对 Ruby 原生扩展(native extension)的支持。原生扩展是一些在 Ruby 进程中加载的共享类库,它们可以访问 Ruby 解析器的内部结构。原生扩展有广泛的应用场合,比如著名的 rcov ,用来检测测试代码覆盖率的工具,就使用了 Ruby 的 API 来检测那些代码在测试运行的时候被实际执行过。

要实现这样的支持就不像我们上边的例子那么简单了,因为这要求一个完整的Ruby C 语言 API实现来和 Ruby 运行时交互。这是一个双向的过程:原生代码可以访问这个 API,同时 Ruby 运行时也可以为某些事件触发回调方法。如果想了解更多关于 Ruby 原生扩展的相关内容请查看 Progamming Ruby 在线版本的扩展Ruby 的章节。

JRuby 中缺少 POSIX 功能支持是否给你带来了麻烦?你希望 JRuby 当中出现什么样的原生扩展呢?

查看英文原文: JNA brings native code to JRuby - - - - - -

译者简介:木雨宝道,Ruby On Rails 开发者,关注各种 Web 开发技术,敏捷开发爱好者,很少饮酒。参与 InfoQ 中文站内容建设,请邮件至 china-editorial[at]infoq.com

2007-09-11 22:30727

评论

发布
暂无评论
发现更多内容

对话 BitSail Contributor | 吴畅:从好奇,到深入

字节跳动数据平台

大数据 开源 开发者 数据集成 企业号 3 月 PK 榜

中国券商数字化转型趋势报告2023

易观分析

金融 券商 经济

远程控制电脑软件哪个好?

RayLink远程工具

远程控制软件 远控软件 远程桌面连接

云原生月报丨值得开发者关注的最新动态

阿里巴巴中间件

阿里云 云原生 月报

镜舟数据库与用友 YonBIP 完成兼容性认证,携手赋能企业数智化发展

镜舟科技

数据库

《流浪地球2》里的机器人企业,如何高质量地交付产品?

万事ONES

天天预约|新功能工具「美团优惠券」上线啦!

天天预约

2023 年开源现状报告确认安全是首要问题

开源雨林

统计学 开源软件 开源现状

【数仓运维实践】关于GaussDB(DWS)单SQL磁盘空间管控

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

2023腾讯最新发布JVM调优笔记,轻松拿捏JVM面试,调优

开心学Java

Java JVM GC

手把手教小伙伴们使用 Nginx 部署 TienChin 项目!

江南一点雨

Java nginx Vue 前后端分离 springboot

MobPush Android SDK合规指南

MobTech袤博科技

使用 CnosDB 与 TensorFlow 进行时间序列预测

CnosDB

tensorflow 时序数据库 时间序列预测 CnosDB

你掌握了吗?在PCB设计中,又快又准地放置元件

华秋PCB

模块 元器件 PCB 原理图 PCB设计

2023年市场快速恢复,社交资讯营销如何把握新机遇

易观分析

社交 资讯

MobPush,专业和免费的消息推送SDK

MobTech袤博科技

计算界年度大赛“先导杯”再度来袭!

科技热闻

Github霸榜!由阿里出品的最新java面试极速突击核心讲

Java编程日记

Java 架构 面试 java程序员 java面试

数字孪生智慧停车场三维可视化管理云平台

2D3D前端可视化开发

智慧停车场 停车场三维可视化 数字孪生智慧停车 无人值守停车场 停车场物联网系统

火山引擎DataTester:抖音的设计团队是如何用A/B测试实现高效优化的?

字节跳动数据平台

大数据 AB testing实战 抖音 A/B 测试 企业号 3 月 PK 榜

国内首家!云科通明湖应用交付控制器通过金融信创生态实验室适配验证

云科通明湖

对话抖音电商:量级庞大、参差不齐,“数据质量治理”有妙招!

字节跳动数据平台

大数据 数据治理 电商 抖音 企业号 3 月 PK 榜

数仓发展史:大数据的“底气”来自于哪?

鼎道智联

大数据 数据仓库

软件测试/测试开发丨app自动化测试之Capability 使用进阶

测试人

软件测试 自动化测试 测试开发 appium capability

Open-GeoIP:超简单的开源IP地址位置查询服务

冯骐

golang 开源 网络 ip地理定位 geoip

直播|SeaTunnel 与 StarRocks 生态融合--让大数据处理回归「简单」

StarRocks

数据库 数据库·

腾讯首席架构师亲自码出的“Redis深度笔记”PDF版限时分享

开心学Java

Java 数据库 redis 腾讯

最新Github霸榜标星96K!号称Java八股“PLUS”版,限时开源!

Java编程日记

Java 程序员 架构 Java 面试 java程序员

宝刀未老?低代码何德何能受大厂们的推崇

这我可不懂

低代码 数字化 大厂 JNPF

基于ByteHouse构建实时数仓实践

字节跳动数据平台

数据库 云原生 Clickhouse 企业号 3 月 PK 榜

虚拟机专用Win10/win11系统镜像下载(m1/intel合集)

真大的脸盆

Mac win10 Mac 软件 win11 win镜像文件

JNA将原生码注入JRuby_Java_Werner Schuster_InfoQ精选文章