微信号:infoqchina

介绍:有内容的技术社区媒体

Java 外部函数接口

2014-03-24 20:02 InfoQ

 JDK增强提案(JEP)191定义了Java Foreign Function Interface(FFI),它是可以将本地函数绑定到Java方法以及管理本地内存块的接口。该提案会使得向JDK中添加本地级别的新特性更容易,而且帮助提供了一个用于Java开发的标准FFI。当前,JavaNative Interface(JNI)是编写Java本地代码的标准编程接口。JNI创建本地函数的方式并不简单,于是产生了像Java Native Access(JNA)和Java Native Runtime(JNR)这样的库。JNA和JNR都是基于JNI创建的,而JEP 191可能会基于JNR。

 

JEP 191在Java级别提供了类似于JNA或JNR的外部函数接口。开发人员可以通过它轻松地访问本地函数,以及在JVM级别管理本地内存。它还将支持未来针对标准JavaFFI的JSR。Java FFIAPI可用于实现本地支持的功能,像NIO、高级文件系统元数据、进程管理。使用FFIAPI而不是JNI绑定本地代码和内存将成为开发人员更喜欢的方式。JEP191并不包含对JNI的增强,不过这些可能会加入到JSR进程中。

 

目前,JNI是编写Java本地方法以及将Java虚拟机嵌入本地应用程序的标准编程接口。它管理着JVM和非托管的本地环境之间的边界,提供数据编组和对象生命周期管理协议。根据JEP191,JNI在下列几个方面最令开发人员痛苦:

·需要开发人员编写C代码,这意味着他们需要具备一个完全不同于Java的世界的专业知识。

·由于开发人员必须对JVM如何管理内存和代码多少有一些了解,所以典型的C和Java开发人员通常并不具备使用JNI所需的专业知识。

·开发人员必须能够为他们想要支持的每个平台构建代码,或者为终端用户提供适当的工具,由他们来完成这项工作。

·相比于相同的库绑定到本地应用程序,基于JNI的库性能通常较差。

·JNI充当了一个不透明的安全边界。JDK并不知道库中的函数可能会调用什么,或者库中的代码是否会损害JVM的稳定或安全。

 

JNI的问题可以通过在JDK中内建FFI API来解决。Java FFI将更容易实现,而且不需要太多关于JVM内部原理和各种宿主平台的专业知识。FFIAPI将提供下列特性:

· 一个描述本地库调用和本地内存结构的元数据系统。

·发现和加载本地库的机制。

· 基于元数据将库/函数或内存结构绑定到Java端点的机制。

·用于Java数据类型和本地数据类型之间编组和解组的代码。

 

JEP 191还可能增加本地调用的JIT优化、GC层可知的本地内存和选择取消已知不必要的JNI安全保护的机制。它还会包含基于JRubyffi-gen库的工具,用于从本地库收集函数和内存的元数据。开发人员还可以设置安全策略,允许绑定到特定函数,而不是库级别的权限。

 

对JavaFFI的需求已经产生了JNA和JNR库。JNA库应用更广泛。JNR库更全面,因为它实现了不同层次的抽象,提供了函数和内存元数据,对库和函数绑定进行了抽象。JNR已经在JRuby项目中大量使用,它可能会成为JEP 191的基础。

 

 ***********************************
本文来自InfoQ微信公众账号:infoqchina
1、回复“今日新闻”,查看今天更新的新闻;
2、回复“今日英文”,查看今天英文站的更新;
3、回复“文章 +关键词”,搜索关键词相关内容;
4、回复“QCon”,了解QCon大会相关信息;
5、回复“活动”,了解最近InfoQ组织的线下沙龙;
6、回复“架构师”,获取《架构师》下载地址;
7、回复“投稿”,了解投稿和加入编辑团队的流程。
***********************************

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 Android中的Drawable资源详解 【大宝】干货典藏:让你爱上文字设计 你知道Twitter是如何显示Gif图的吗? 难者最了解难者 当规模到亿级,MySQL是一个更好的NoSQL!