巴拿马项目是一项 openjdk 计划,旨在改善 java 和本机代码之间的连接。它的关键组件之一是外部函数和内存 api,它简化并增强了 java 应用程序与本机库和内存交互的方式。
什么是外部函数和内存 api?
foreign function & memory api 允许 java 程序调用本机函数并直接管理本机内存。此 api 提供了一种更安全、更有效的方式来执行需要 java 本机接口 (jni) 的操作。
外部函数和内存 api 的优点
安全:api 包含安全功能,可防止与本机代码相关的常见错误,例如内存泄漏和缓冲区溢出。
性能:通过允许直接访问本机函数和内存,api 可以显着提高需要与本机库交互的 java 应用程序的性能。
简单性:与 jni 相比,api 简化了调用原生代码的过程,减少了样板代码,使代码更易于维护。
使用外部函数和内存 api
以下是如何使用外部函数和内存 api 调用本机函数的示例:
定义原生函数签名
首先,您需要定义要调用的本机函数的签名。假设我们有一个具有以下函数的 c 库:
// native.c
include
void sayhello() {
printf("hello from c!\n");
}
</stdio.h>登录后复制
加载原生库并调用函数
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();
}
}
}
登录后复制
在此示例中:
点击下载“C盘瘦身工具,一键清理C盘”;
我们使用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);
}
}
}
登录后复制
在此示例中:
点击下载“C盘瘦身工具,一键清理C盘”;
我们分配一块本机内存。
我们从分配的内存中写入和读取一个字节。
会话关闭时,内存会自动释放。
结论
外部函数和内存 api 是 java 生态系统的强大补充,提供了一种更安全、更高效、更简单的方式与本机代码和内存交互。无论您需要调用本机函数还是管理本机内存,此 api 都为 java 应用程序开辟了新的可能性。
以上就是外部函数和内存 API 简介(巴拿马项目)的详细内容,更多请关注php中文网其它相关文章! 

BrianSab10 天前
发表在:南通速强批量添加水印专家 v1.83Эта статья для ознак...
Ronaldgag12 天前
发表在:11日17日,星期一,在这里每天60秒读懂世界!Free PHP Blockchain ...
NelsonBOT12 天前
发表在:11日16日,星期日,在这里每天60秒读懂世界!Free non-criminal in...
Darrenjhjhjhcunny14 天前
发表在:11日14日,星期五,在这里每天60秒读懂世界!Атака черной материи...
parifoot-rdc-7926 天前
发表在:laravel 找不到页面Votre guide <a href=...
Anya142Sa1 个月前
发表在:ASUS华硕A8N-SLI Deluxe主板BIOS 10110Hello friends! I c...
91资源网站长-冰晨1 个月前
发表在:广告合作123
FrankFAT1 个月前
发表在:10日14日,星期二,在这里每天60秒读懂世界!Big cocks of blacks ...
RichardGlymn1 个月前
发表在:Java webservice多个参数怎么调用https://t.me/win_1_c...
Thomasstolo1 个月前
发表在:Java webservice多个参数怎么调用https://t.me/s/Casin...