速来报名!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:30833

评论

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

双十一降本增效新路径!华为云Flexus X实例为中小企业注入“硬核”动力

YG科技

权限系统:权限应用服务设计

不在线第一只蜗牛

架构 应用开发

技术干货丨Inspire Cast 如何避免自动网格划分失败?

Altair RapidMiner

人工智能 仿真 智能制造 altair Inspire

深入了解测试开发与DevOps体系

测试人

软件测试

微短剧出海大升级:窄带高清降本,极致播放体验,海外合规更安心

阿里云CloudImagine

人工智能 AIGC 窄带高清 视频翻译 短剧出海

CCF - 网易雷火基金项目成果:基于大小模型协同的低资源标注技术|CNCC 2024 演讲实录

网易伏羲

人工智能 网易伏羲 cncc

Greptime 空降深圳|「从云原生到 AI 时代,全栈可观测性的实践与演进」 Meetup 圆满结束

Greptime 格睿科技

云原生 活动 可观测

IPQ5322: Qualcomm’s Wi-Fi 7 Chipset for Superior Indoor Networking

wallyslilly

硬核剧透!龙蜥开源软件供应链及操作系统安全MeetUp全议程来啦

OpenAnolis小助手

开源 操作系统 龙蜥社区 龙蜥meetup

甘特图与项目管理:深入了解两种项目管理方式

爱吃小舅的鱼

项目管理 甘特图

One Switch for Mac(系统功能快速开关工具)

Mac相关知识分享

打造透明、高效的分布式系统:通过 EMQX ECP 集成实现链路追踪功能

EMQ映云科技

链路追踪 emqx EMQX ECP 边缘服务

简单聊聊微前端

快乐非自愿限量之名

前端

14.策略者模式设计思想

杨充

Mysql篇-三大日志

EquatorCoco

MySQL 数据库

在华为开发者空间,简单几步带你实现AI风格化编程

华为云开发者联盟

云主机 华为云ModelArts FunctionGraph AI 大底座

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同

GreatSQL

数据库

快递鸟快递查询API接口参数代码

快递鸟

快递

双十一轻松跨越数字鸿沟!华为云Flexus X实例引领中小企业低成本上云

YG科技

科技赋能绿色“碳”索,下党零碳示范基地启幕

新消费日报

掌握项目管理的流程:实现项目目标的系统步骤

爱吃小舅的鱼

项目管理流程

为什么DDoS攻击如此普遍?

网络安全服务

黑客 流量 DDoS AI人工智能 DDoS 攻击

浅谈低代码平台助力企业数字化转型

EquatorCoco

低代码

牛客网Java面试题及答案整理(2024年最新版,持续更新)

采菊东篱下

编程 java面试

一夜之间,内容行业和大模型行业被这个All in One产品改变了

脑极体

AI

框图是什么,如何制作?10个框图模板推荐!

职场工具箱

职场 IT 在线白板 绘图软件 线框图软件

NTFS Disk by Omi NTFS for mac(NTFS 磁盘管理器)

Mac相关知识分享

OmniGraffle for mac(思维导图软件)中文版

Mac相关知识分享

双十一首款柔性算力云服务器亮相全新亮相!华为云Fleus X 实例到底有多强?

YG科技

StarRocks Summit Asia 2024 全部议程公布!

StarRocks

微博热搜榜数据:免费API调用与市场洞察

幂简集成

API 微博热搜 微博

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