时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

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

评论

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

基于华为开发者空间-Astro低代码平台,构建用户登录功能开发

华为云开发者联盟

低代码 华为云Astro 华为开发者空间

跨芯片 AI 算子库 FlagGems 正式加入PyTorch 基金会生态项目体系

智源研究院

【公开课】芯片ATE测试—93K机台与Smartest软件介绍

IC男奋斗史

芯片 半导体 测试工程师 芯片技术 芯片测试

天润融通AI助手,8大AI功限时免费体验中!

天润融通

Golang基础笔记六之流程控制

Hunter熊

Go 流程控制 条件语句 循环语句 for循环

从0到100:房产中介小程序开发笔记(中)

CC同学

C# 中委托和事件的深度剖析与应用场景

量贩潮汐·WholesaleTide

Java C#

位置核验方案

天翼云开发者社区

位置核验

StarRocks 向量索引如何让大模型“记性更好”?

镜舟科技

分析型数据库 大模型 StarRocks 向量索引 RAG 框架

从0到1:文旅小程序开发笔记(上)

CC同学

签约快讯|天润融通签约滴滴企业版

天润融通

鸿蒙 SideBarContainer 开发攻略:侧边栏交互设计与多端适配

谢道韫

覆盖设计、开发、上线、运营全链路,腾讯游戏云发布小游戏全方位解决方案

极客天地

腾讯云联合Gartner发布《Data+AI下一代数智平台建设指南》

极客天地

大数据-24 Sqoop MySQL到Hive 与 Hive到MySQL JDBC ETL MapReduce

武子康

MySQL 大数据 hdfs sqoop ETL

恒拓高科 × 华为共建鸿蒙生态:BeeWorks打造全免费的超级数字化协作平台

BeeWorks

信创 CDC 实战|国产数据库的数据高速通道:Dameng → Doris 实时入仓同步方案

tapdata

达梦数据同步 数据进doris 实时数据入仓 ogg国产替代 数据同步工具推荐

代码界的“外卖加速包”:当程序员爱上拖拖拉拉

秃头小帅oi

在京东,向前一步的技术人

京东零售技术

解码供应链数字化转型:低代码如何破解多环节协同的技术困局?

不在线第一只蜗牛

通过ETL从MySQL同步到GaussDB

谷云科技RestCloud

MySQL 数据库 ETL 数据集成工具 GaussDB 实时同步

参赛报名|百万奖金+全球曝光:2025港科百创赛事正式启动!

声网

Dify + OceanBase + MCP:三剑合璧,轻松构建 RAG 应用

Se7en

和鲸科技联合四川气象斩获 2025 爱分析·DeepSeek 最佳实践案例

ModelWhale

最佳案例 爱分析 DeepSeek 四川气象

节省前端1000+pd人力成本!快手快聘「伏羲工作台」技术实践全解析

快手技术

前端 快手

互联网巨头争抢AI人才 京东以科技温度+产业厚度构筑人才热土

京东零售技术

封禁UDP端口提高防御能力分析

网络安全服务

CDN 服务器 udp DDoS 带宽

数字先锋 | 驱动“芯”发展,天翼云携手黑芝麻智能开启EDA上云之路!

天翼云开发者社区

云计算 超算

大模型走向深度应用,CTO们的硬仗才刚刚开始

Alter

阿里P8面试官给校招及社招程序员的建议(JAVA岗)!

程序员高级码农

java 程序员‘

Nuclear - 基于流媒体的隐私优先音乐播放器

qife122

流媒体 音乐播放器

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