写点什么

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:374125
用户头像

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

关注

评论

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

开源一夏|OpenHarmony跳转拨号界面

坚果

开源 OpenHarmony 8月月更

Linux部署hadoop2.7.7集群

程序员欣宸

hadoop 8月月更

面试突击74:properties和yml有什么区别?

王磊

Java 常见面试题

极狐 Git Lab 冷知识:妙用 Badge 徽章

郭旭东

极狐GitLab JIHULAB 101

极狐 GitLab 冷知识:GitLab CI 最熟悉的陌生关键字 script

郭旭东

极狐GitLab JIHULAB 101

云原生(十七) | Kubernetes篇之深入了解Deployment

Lansonli

云原生 8月月更

企业架构是当代的屠龙之术吗?

涛哥 数字产品和业务架构

企业架构

头脑风暴:组合总和 Ⅳ

HelloWorld杰少

8月月更

阿里云解决方案架构师张平:云原生数字化安全生产的体系建设

阿里巴巴云原生

阿里云 云原生 安全 数字化

RocketMQ高性能设计之数据存储设计

急需上岸的小谢

8月月更

SpringBoot 实战:国际化组件 MessageSource 与 Nacos 组合实现动态配置能力

看山

源码 nacos springboot MessageSources

三种插件开发模式,带你玩废tinymce

Five

tinymce 签约计划第三季 8月月更

深入浅出sychronized与Lock的实现原理

清风

后端 原理 并发 lock sychronized

记一次 ClickHouse 性能测试

劼哥stone

基于jwt的token验证、原理及流程

TimeFriends

8月月更

在线文字图标logo文章封面图生成工具

入门小站

工具

在线XML转Excel工具

入门小站

工具

什么是研发效能?研发效能定义及核心价值

laofo

DevOps cicd 研发效能 持续交付 工程效率

最多可省19%!阿里云第七代云服务器ECS中国大陆地域调价通知

阿里云弹性计算

云计算 阿里云 ECS 企业创新

极狐 GitLab 冷知识:使用 git push 创建 Merge Request

郭旭东

极狐GitLab JIHULAB 101

对 Service Mesh 望而却步?可能都没理解这一点

baiyutang

架构 微服务 签约计划第三季 servicemes

11 个需要避免的 React 错误用法

Geek_z9ygea

JavaScript typescript React

极狐 GitLab 冷知识:如何美化 issue 内容

郭旭东

极狐GitLab JIHULAB 101

前端食堂技术周刊第 48 期:ESLint 新配置系统、Vue3 中文文档正式上线、Astro 1.0、小程序新渲染引擎

童欧巴

[极致用户体验] 你的 Link Button 能让用户选择新页面打开吗?

HullQin

CSS JavaScript html 前端 8月月更

极狐 GitLab 冷知识:在 Gitlab CI Pipeline 中进行 Git Push 操作

郭旭东

极狐GitLab JIHULAB 101

Kafka基础知识

阿泽🧸

kafka 8月月更

开源一夏 | 见微知著,带你认认数据分析的大门,站在门口感受一下预测的魅力

迷彩

开源 数据分析 预测模型 签约计划第三季 8月月更

数据库知识点总结

乌龟哥哥

8月月更

【ZK简明教程】(1)零知识证明的背景和系统结构

比特之心

区块链 零知识证明 密码学 签约计划第三季

C++学习------cfenv头文件的作用与源码分析

桑榆

签约计划第三季

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