写点什么

Java 外部函数接口

  • 2014-03-20
  • 本文字数:1184 字

    阅读完需:约 4 分钟

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

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

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

  • 需要开发人员编写 C 代码,这意味着他们需要具备一个完全不同于 Java 的世界的专业知识。
  • 由于开发人员必须对 JVM 如何管理内存和代码多少有一些了解,所以典型的 C 和 Java 开发人员通常并不具备使用 JNI 所需的专业知识。
  • 开发人员必须能够为他们想要支持的每个平台构建代码,或者为终端用户提供适当的工具,由他们来完成这项工作。
  • 相比于相同的库绑定到本地应用程序,基于 JNI 的库性能通常较差。
  • JNI 充当了一个不透明的安全边界。JDK 并不知道库中的函数可能会调用什么,或者库中的代码是否会损害 JVM 的稳定或安全。

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

  • 一个描述本地库调用和本地内存结构的元数据系统。
  • 发现和加载本地库的机制。
  • 基于元数据将库 / 函数或内存结构绑定到 Java 端点的机制。
  • 用于 Java 数据类型和本地数据类型之间编组和解组的代码。

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

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

查看英文原文:**** Java Foreign Function Interface

2014-03-20 22:373996
用户头像

发布了 256 篇内容, 共 97.3 次阅读, 收获喜欢 12 次。

关注

评论

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

vue组件通信6种方式总结(常问知识点)

bb_xiaxia1998

Vue

SAP | 在abap开发过程中常用的Tcode

暮春零贰

SAP abap 10月月更

全网独家首发Java面试题,包含Spring全家桶+高并发+Netty+Redis+Dubbo等面试专题

小二,上酒上酒

Java Linux Netty 高并发 Spring全家桶

牛啊牛啊,这篇Spring Cloud Alibaba笔记一应俱全,几乎涵盖了所有操作

小二,上酒上酒

spring spring cloud alibaba

vue组件通信方式有哪些?

bb_xiaxia1998

Vue

TDengine | taosdump的使用方法和注意事项

TDengine

数据库 tdengine 开源 时序数据库 taosdump

双活数据中心建设要点

穿过生命散发芬芳

10月月更 双数据中心

耗时182天肝出来1015页分布式全栈手册太香了

程序知音

Java 程序员 架构 分布式 后端技术

Koordinator v0.7: 为任务调度领域注入新活力

阿里巴巴云原生

阿里云 云原生 Koordinator

惊为天人,百度推出的Redis笔记真的太香了

小二,上酒上酒

redis 面试

这份神仙级Spring Security源码手册,真的很强悍

小二,上酒上酒

spring spring security springboot

P9力鉴!Alibaba9月最新出品776页JDK源码+并发核心原理解析小册

程序知音

Java 架构 jdk 并发编程 后端技术

全网疯传,SpringBoot笔记(全彩版)顶翻天

程序知音

Java spring 源码 springboot 后端技术

见大牛、聊感悟、拿好礼...开发者一起来微软Ignite赴约!

InfoQ写作社区官方

热门活动

在数字化浪潮中,为企业建造一艘“方舟”

元年技术洞察

微服务 云原生 企业数字化 PaaS 平台

太牛了,这份Spring Cloud Alibaba学习文档清晰全面,一应俱全

小二,上酒上酒

spring Spring Cloud

阿里内部整理的Spring boot保姆级笔记,简直太牛了

小二,上酒上酒

spring springboot

来了来了,阿里p9整理的Netty速成笔记,应有尽有

小二,上酒上酒

Netty

短期内跳槽的Java程序员必看的八项知识点+两大项目实战

Geek_0c76c3

Java 数据库 开源 程序员 开发

Java后端没这些东西都不敢跳!对标阿里P7技术路线你值得拥有

Geek_0c76c3

Java 数据库 程序员 架构 开发

数据中台建设5大关键步骤

阿泽🧸

数据中台 10月月更

【一Go到底】第十二天---switch

指剑

Go Goalng 10月月更

金三银四跳槽季,美团、字节、阿里、腾讯Java面经,终入字节

Geek_0c76c3

Java 数据库 开源 程序员 开发

【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例

冰河

并发编程 多线程 高并发 协程 异步编程

精彩演讲推荐|智能化变更防控方法、架构与组织实践

TRaaS

大型企业选择低代码的主要原因是什么?

优秀

低代码 低代码平台

还不懂Spring?阿里架构师整理的Spring宝典助你一臂之力

小二,上酒上酒

spring spring cloud ali spring宝典

ConcurrentDictionary<T,V> 的这两个操作不是原子性的

有态度的马甲

腾讯资深架构师整理出来的Java高级开发需要的分布式技术,简直绝了

小二,上酒上酒

Java 编程 JAVA开发

进击的PyTorch,和它背后的开源领袖

OneFlow

人工智能 机器学习 深度学习 开源

阿里出品的这份Java性能调优实战手册,直接涨薪25K,真的香啊

小二,上酒上酒

Java 阿里 阿里面试

Java 外部函数接口_Java_Bienvenido David_InfoQ精选文章