写点什么

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:301286

评论

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

我们收到了数百份AI“生存提案”|72小时AI生存挑战招募中

RTE开发者社区

TiDB 社区第四届专栏征文大赛联合墨天轮火热开启,TiDB 业务场景实战、运维开发攻略两大赛道,BOSE 降噪耳机、大疆手持云台、投影仪、运动手环、礼品卡等重磅礼品等你来拿!

TiDB 社区干货传送门

数据库 运维 分布式数据库 征文大赛 TiDB

别让工具拖后腿!2025年Top5 AI代码工具,让Java开发效率翻倍

飞算JavaAI开发助手

站在“场景化保险”拐点的致保科技,按下了增长“加速键”

Alter

YashanDB知识库|BeetISQL 批量插入时报 autoAssignKey 异常?可能是 rowid 惹的祸

数据库砖家

数据库·

AI在线生成组织架构图!办公效率原地起飞!

职场工具箱

AI 办公软件 AIGC 绘图软件 组织架构图

让 LLM 来评判 | 基础概念

量贩潮汐·WholesaleTide

LLM

YashanDB知识库|集成 Druid 连接池时日志报 “token IDENTIFIER start”?问题虽小但有来头!

数据库砖家

数据库·

YashanDB知识库|一个 SQL 多个执行计划?绑定参数背后的优化器逻辑别忽略

数据库砖家

数据库·

YashanDB 知识库|如何远程连接 YashanDB 数据库?最全工具和方式合集!

数据库砖家

数据库·

BOE(京东方)LTPO技术赋能vivo x200 Ultra 超低功耗解锁专业级影像新体验

爱极客侠

海外加速专线:解锁跨国视频会议,助您畅享畅聊体验

宽炜网络

海外网络专线

飞算 JavaAI 与 Spring Boot:如何实现微服务开发效率翻倍?

飞算JavaAI开发助手

YashanDB知识库|用 yasldr 导入 LOB 字段,有几种方式?lls 和 lobfile 怎么选?

数据库砖家

数据库·

YashanDB|设置了归档日志上限,为什么磁盘还是被打爆了?

数据库砖家

数据库·

YashanDB知识库|服务端编码是 GBK,为什么升级失败了?这其实是个字符集对齐问题

数据库砖家

数据库·

电信SD-WAN线路的有那些优势

宽炜网络

电信sd-wan

炸裂!推荐一款开源项目集成 Dify 到钉钉

柯杰

钉钉 dify

【参会有礼】4.26 广州 | 国产开源 AI 数据库技术交流

Apache IoTDB

分析型数据库与事务型数据库?核心差异与选型指南

镜舟科技

OLAP 分析型数据库 OLTP 事务型数据库 数据存储结构

智源数据新基建系列Workshop | 从大模型到具身智能

智源研究院

从代码小白到 Java 高手:AI 工具如何压缩你的学习曲线?

飞算JavaAI开发助手

YashanDB知识库|JDBC 和 OCI 驱动需要设置字符集吗?其实你可能多虑了!

数据库砖家

数据库·

iVX:图形化编程语言 + IDE,而非传统 “代码平台”

代码制造者

无代码平台

YashanDB知识库|Quartz调度写布尔值报错?问题关键在于 true/false 与 0/1 的差异

数据库砖家

数据库·

YashanDB知识库|别名和变量同名就报错?这个“重名陷阱”得避开!

数据库砖家

数据库·

Arthas monitor(方法执行监控)

刘大猫

Java 监控 Monitor Arthas 方法执行监控

阶跃星辰发布端到端语音接口 Realtime API,理解情绪、随时打断;Dia TTS:生成语音可带笑声、咳嗽声、清嗓子丨日报

RTE开发者社区

飞算 JavaAI 实战:从零搭建电商系统,代码一键生成!

飞算JavaAI开发助手

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