BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

JNA将原生码注入JRuby

| 作者 Werner Schuster 关注 9 他的粉丝 ,译者 木雨宝道 关注 0 他的粉丝 发布于 2007年9月13日. 估计阅读时间: 5 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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;

public interface POSIX extends Library {
  public int chmod(String filename, int mode);
  public int chown(String filename, int owner, int group);
}

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

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

import com.sun.jna.Native;
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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT