”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 外部函数和内存 API 简介(巴拿马项目)

外部函数和内存 API 简介(巴拿马项目)

发布于2024-08-06
浏览:146

Introduction to the Foreign Function & Memory API (Project Panama)

巴拿马项目是一项 OpenJDK 计划,旨在改善 Java 和本机代码之间的连接。它的关键组件之一是外部函数和内存 API,它简化并增强了 Java 应用程序与本机库和内存交互的方式。

什么是外部函数和内存 API?

Foreign Function & Memory API 允许 Java 程序调用本机函数并直接管理本机内存。此 API 提供了一种更安全、更有效的方法来执行原本需要 Java 本机接口 (JNI) 的操作。

外部函数和内存 API 的优点

  1. 安全:API 包含安全功能,可防止与本机代码相关的常见错误,例如内存泄漏和缓冲区溢出。
  2. 性能:通过允许直接访问本机函数和内存,API 可以显着提高需要与本机库交互的 Java 应用程序的性能。
  3. 简单性:与JNI相比,API简化了调用本机代码的过程,减少了样板代码,使代码更易于维护。

使用外部函数和内存 API

以下是如何使用外部函数和内存 API 调用本机函数的示例:

  1. 定义本机函数签名

首先,您需要定义要调用的本机函数的签名。假设我们有一个具有以下函数的 C 库:

// native.c
#include 

void sayHello() {
    printf("Hello from C!\n");
}
  1. 加载原生库并调用函数
import jdk.incubator.foreign.*;

public class ForeignFunctionExample {
    public static void main(String[] args) {
        try (var session = MemorySession.openConfined()) {
            SymbolLookup lookup = SymbolLookup.loaderLookup();
            var sayHello = lookup.find("sayHello").orElseThrow();

            var sayHelloHandle = CLinker.getInstance().downcallHandle(
                sayHello,
                FunctionDescriptor.ofVoid()
            );

            sayHelloHandle.invokeExact();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

在此示例中:

  • 我们使用SymbolLookup在加载的本机库中查找sayHello函数。
  • 我们使用 CLinker 创建函数的句柄。
  • 我们使用句柄调用本机函数。

管理本机内存

外部函数和内存 API 还允许您安全地管理本机内存。这是一个例子:

import jdk.incubator.foreign.*;

public class MemoryManagementExample {
    public static void main(String[] args) {
        try (var session = MemorySession.openConfined()) {
            MemorySegment segment = MemorySegment.allocateNative(100, session);

            MemoryAccess.setByteAtOffset(segment, 0, (byte) 42);
            byte value = MemoryAccess.getByteAtOffset(segment, 0);

            System.out.println("Value: "   value);
        }
    }
}

在此示例中:

  • 我们分配一块本机内存。
  • 我们从分配的内存中写入和读取一个字节。
  • 会话关闭时,内存会自动释放。

结论

Foreign Function & Memory API 是 Java 生态系统的强大补充,提供了一种更安全、更高效、更简单的方式与本机代码和内存交互。无论您需要调用本机函数还是管理本机内存,此 API 都为 Java 应用程序开辟了新的可能性。

版本声明 本文转载于:https://dev.to/adaumircosta/introduction-to-the-foreign-function-memory-api-project-panama-20c8?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用触发器和UDF从MySQL 5.1发送动态电子邮件通知?
    如何使用触发器和UDF从MySQL 5.1发送动态电子邮件通知?
    如何从mysql 5.1 使用SMTP和OUTFILE 在test.emaildrop上插入之前,请创建触发test.autosendfromdrop 每行开始 /*在此处启动电子邮件文件的写作*/ 选择 concat(“ to:”,new.to), con...
    编程 发布于2025-02-07
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令arr = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-02-07
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    在这里工作/},false); 不幸的是,答案是否。除非在Creation中存储对处理程序的引用。要解决此问题,请考虑将事件处理程序存储在中心位置,例如页面的主要对象,请考虑将事件处理程序存储在中心位置,否则无法清理匿名事件处理程序。 。这允许在需要时轻松迭代和清洁处理程序。
    编程 发布于2025-02-07
  • 在映射到MySQL枚举列时,如何确保冬眠保留值?
    在映射到MySQL枚举列时,如何确保冬眠保留值?
    在hibernate中保存枚举值:故障排除错误的列type ,他们各自的映射至关重要。在Java中使用枚举类型时,至关重要的是,建立冬眠的方式如何映射到基础数据库。在您的情况下,您已将MySQL列定义为枚举,并在Java中创建了相应的枚举代码。但是,您遇到以下错误:“ MyApp中的错误列类型。...
    编程 发布于2025-02-07
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    使用(1)而不是(;;)会导致无限循环的性能差异? 现代编译器,(1)和(;;)之间没有性能差异。 是如何实现这些循环的技术分析在编译器中: perl: S-> 7 8 unstack v-> 4 -e语法ok 在GCC中,两者都循环到相同的汇编代码中,如下所示:。 globl t_时 t_时...
    编程 发布于2025-02-07
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。可以将fd.append("fileToUpload[]", files[x]);方法用于此目的,允许您在单个请求中发送多个文件。 初始尝试 在JavaScript中,一种常见方法是:); 但是,此代码仅处理第一...
    编程 发布于2025-02-07
  • 为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    网格超过身体,用100%grid-template-columns 问题:考虑以下CSS和HTML: position:fixed; grid-template-columns:40%60%; grid-gap:5px; 背景:#eee; 当位置未固定时,网格将正确显示。但是,当...
    编程 发布于2025-02-07
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在java中的多个返回类型:一个误解介绍,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但是,情况确实如此吗?通用方法:拆开神秘 [方法仅具有单一的返回类型。相反,它采用机制,如钻石符号“ ”。分解方法签名: :本节定义了一个通用类型参数,E。它表示该方法接受了扩展foo类的任...
    编程 发布于2025-02-07
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    在尝试将image存储在mysql数据库中时,您可能会遇到一个可能会遇到问题。本指南将提供成功存储您的图像数据的解决方案。 easudy values('$ this-> image_id','file_get_contents($ tmp_image)...
    编程 发布于2025-02-07
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-02-07
  • 如何将数据插入MySQL:相当于MS SQL的散装插入物?
    如何将数据插入MySQL:相当于MS SQL的散装插入物?
    在MySQL中插入:在数据库管理的领域中拆开其等效于MS SQL 的等价,有效数据加载是必不可少的。 Microsoft SQL Server拥有批量插入命令,用于迅速从文本文件中导入数据。同样,MySQL提供了一个类似的解决方案来完成此任务。 在MySQL中执行批量插入操作,使用的主要技术是负载...
    编程 发布于2025-02-07
  • 如何使用char_length()在mySQL中按字符串长度对数据进行排序?
    如何使用char_length()在mySQL中按字符串长度对数据进行排序?
    [2使用内置的char_length()function。 char_length()和length() 此查询将从指定的表中检索所有行,并基于上升顺序对它们进行排序指定列的字符长度。带有更长字符串的行将出现在结果的底部。
    编程 发布于2025-02-07
  • 如何使用LOAD_FILE故障排除MySQL Blob加载问题?
    如何使用LOAD_FILE故障排除MySQL Blob加载问题?
    加载文件加载到mysql blobs中,带有load_file ,假设您会遇到问题,将文件加载到mysql blob中,专门使用load_file函数。如文档中概述的,该功能的功能需要在服务器上满足某些条件。这些条件包括:[在服务器主机文件对所有用户的访问性 文件大小以下下方的max_allowe...
    编程 发布于2025-02-07
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。 To resolve this issue and ensure scripts execute on subsequent page visits, Firefox...
    编程 发布于2025-02-07
  • 如何在Java列表中有效计算元素的发生?
    如何在Java列表中有效计算元素的发生?
    计数列表中的元素出现在列表 中,在java编程中,列举列表中列举元素出现的任务来自列表。为此,收集框架提供了全面的工具套件。在这种情况下,Batocurrences变量将保持值3,代表动物列表中的“ BAT”出现的数量。 &&& [此方法是简单的,可以得出准确的结果,使其成为计算列表中元素出现的理...
    编程 发布于2025-02-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3