亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
一、為什麼需要Foreign Function & Memory API?
二、核心組件詳解
2. ValueLayout 與MemoryLayout:內(nèi)存佈局定義
3. SymbolLookup:查找本地函數(shù)符號
4. FunctionDescriptor 與MethodHandle:定義並調(diào)用外部函數(shù)
示例:調(diào)用C 的printf
三、調(diào)用自定義本地庫(簡單示例)
四、Arena:內(nèi)存生命週期管理
五、與JNI 相比的優(yōu)勢
六、當(dāng)前狀態(tài)與註意事項(xiàng)
首頁 Java java教程 Java中的外部功能和內(nèi)存API 21

Java中的外部功能和內(nèi)存API 21

Jul 29, 2025 am 01:16 AM
java api

Java 21引入Foreign Function & Memory API以解決JNI的複雜性、安全性差、性能開銷大等問題;2. 核心組件包括MemorySegment(內(nèi)存抽象)、ValueLayout/MemoryLayout(內(nèi)存佈局)、SymbolLookup(函數(shù)符號查找)、FunctionDescriptor與MethodHandle(函數(shù)調(diào)用定義)、Arena(內(nèi)存生命週期管理);3. 通過純Java代碼可安全高效地調(diào)用本地函數(shù)和操作堆外內(nèi)存,無需編寫C代碼或手動管理內(nèi)存;4. 相比JNI,F(xiàn)FM API提供更強(qiáng)的類型安全、自動內(nèi)存管理、更優(yōu)性能和更高安全性;5. 當(dāng)前在Java 21中為預(yù)覽特性,需啟用--enable-preview,尚未推薦用於生產(chǎn)環(huán)境,預(yù)計(jì)將在後續(xù)版本中正式發(fā)布。

The Foreign Function & Memory API in Java 21

Java 21 引入了Foreign Function & Memory API (FFM API),這是一個重要的新特性,旨在讓Java 程序能夠安全、高效地調(diào)用本地庫(如C/C 編寫的動態(tài)鏈接庫)並與堆外內(nèi)存進(jìn)行交互。它取代了長期存在但問題較多的JNI(Java Native Interface),提供了更現(xiàn)代、更簡潔、更安全的方式來處理與原生代碼的互操作。

The Foreign Function & Memory API in Java 21

這個API 的核心目標(biāo)是:讓Java 能像調(diào)用本地方法一樣自然地訪問本地函數(shù)和內(nèi)存,同時避免JNI 的複雜性和安全隱患。


一、為什麼需要Foreign Function & Memory API?

在Java 21 之前,與本地代碼交互主要依賴JNI ,但它存在諸多問題:

The Foreign Function & Memory API in Java 21
  • 複雜繁瑣:需要編寫C 代碼、生成頭文件、編譯共享庫,開發(fā)流程不流暢。
  • 易出錯:手動管理內(nèi)存和類型轉(zhuǎn)換容易導(dǎo)致崩潰(如段錯誤)。
  • 性能開銷:JNI 調(diào)用有較高的上下文切換成本。
  • 安全性差:直接操作指針,缺乏內(nèi)存訪問邊界檢查。

Foreign Function & Memory API 的出現(xiàn)正是為了解決這些問題,提供一種純Java 的方式來實(shí)現(xiàn)外部函數(shù)調(diào)用和內(nèi)存操作。


二、核心組件詳解

FFM API 主要由以下幾個關(guān)鍵類組成,位於java.lang.foreign包中:

The Foreign Function & Memory API in Java 21

1. MemorySegment:堆外內(nèi)存的抽象

MemorySegment表示一段連續(xù)的內(nèi)存區(qū)域,可以是堆內(nèi)或堆外,甚至是本地內(nèi)存(native memory)。它是對原始內(nèi)存的安全封裝。

 // 分配100 字節(jié)的堆外內(nèi)存try (MemorySegment segment = MemorySegment.allocateNative(100)) {
    segment.set(JAVA_INT, 0, 42); // 在偏移0 處寫入int
    int value = segment.get(JAVA_INT, 0); // 讀取System.out.println(value); // 輸出42
}
  • 使用allocateNative()分配本地內(nèi)存。
  • 使用set() / get()方法配合ValueLayout (如JAVA_INT )進(jìn)行類型化讀寫。
  • 必須在try-with-resources中使用,確保內(nèi)存被及時釋放。

2. ValueLayout 與MemoryLayout:內(nèi)存佈局定義

用於描述數(shù)據(jù)結(jié)構(gòu)的佈局,比如基本類型、結(jié)構(gòu)體、數(shù)組等。

 ValueLayout.OfInt INT = ValueLayout.JAVA_INT;
SequenceLayout arrayLayout = MemoryLayout.sequenceLayout(10, INT); // int[10]

這些佈局可用於構(gòu)建函數(shù)參數(shù)類型或結(jié)構(gòu)體映射。

3. SymbolLookup:查找本地函數(shù)符號

用於定位動態(tài)庫中的函數(shù)地址。

 SymbolLookup lookup = SymbolLookup.libraryLookup("libc.so.6"); // Linux
// 或SymbolLookup.libraryLookup("msvcrt.dll") on Windows

4. FunctionDescriptor 與MethodHandle:定義並調(diào)用外部函數(shù)

FunctionDescriptor描述函數(shù)的參數(shù)和返回類型,結(jié)合Linker獲取可調(diào)用的MethodHandle 。

示例:調(diào)用C 的printf
 import java.lang.foreign.*;
import static java.lang.foreign.ValueLayout.*;

Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();

// 定義printf 函數(shù)簽名:int printf(const char*, ...)
FunctionDescriptor printfDesc = FunctionDescriptor.of(JAVA_INT, ADDRESS);

MethodHandle printf = linker.downcallHandle(stdlib.find("printf").orElseThrow(), printfDesc);

// 準(zhǔn)備字符串(必須以NULL 結(jié)尾)
try (Arena arena = Arena.ofConfined()) {
    MemorySegment format = arena.allocateFrom("Hello from %s!\n");
    MemorySegment name = arena.allocateFrom("FFM API");

    // 調(diào)用printf
    printf.invoke(format, name);
}

輸出:

 Hello from FFM API!

注意:變參函數(shù)支持有限,此例中只傳了兩個參數(shù),實(shí)際使用需謹(jǐn)慎。


三、調(diào)用自定義本地庫(簡單示例)

假設(shè)你有一個C 函數(shù):

 // libadd.so (Linux) / add.dll (Windows)
int add(int a, int b) {
    return ab;
}

編譯為共享庫後,在Java 中調(diào)用:

 try (Arena arena = Arena.ofConfined()) {
    Linker linker = Linker.nativeLinker();
    SymbolLookup lookup = linker.defaultLookup(); // 或指定路徑FunctionDescriptor addDesc = FunctionDescriptor.of(JAVA_INT, JAVA_INT, JAVA_INT);
    MethodHandle add = linker.downcallHandle(
        lookup.find("add").orElseThrow(),
        addDesc
    );

    int result = (int) add.invoke(3, 4);
    System.out.println("3 4 = " result); // 輸出7
}

無需寫JNI 代碼,完全在Java 層完成。


四、Arena:內(nèi)存生命週期管理

Java 21 引入了Arena概念來統(tǒng)一管理MemorySegment的生命週期。

  • Arena.ofConfined() :單線程訪問,性能好。
  • Arena.ofShared() :多線程共享,更安全但有同步開銷。
 try (Arena arena = Arena.ofConfined()) {
    MemorySegment seg = arena.allocate(100);
    // 使用seg...
} // 自動釋放所有內(nèi)存

這是防止內(nèi)存洩漏的關(guān)鍵機(jī)制。


五、與JNI 相比的優(yōu)勢

特性JNI FFM API
是否需要native 代碼
內(nèi)存管理手動(易錯) Arena 自動管理
類型安全弱(宏定義)強(qiáng)(ValueLayout)
性能一般,調(diào)用開銷高更優(yōu),JVM 可優(yōu)化
易用性複雜簡潔,純Java
安全性低(直接指針)高(邊界檢查)

六、當(dāng)前狀態(tài)與註意事項(xiàng)

  • Java 21 中仍是預(yù)覽特性(Preview Feature ),需啟用預(yù)覽選項(xiàng):
     javac --release 21 --enable-preview YourClass.java
    java --enable-preview YourClass
  • API 未來可能調(diào)整,不建議用於生產(chǎn)環(huán)境直到轉(zhuǎn)正(預(yù)計(jì)Java 22 或23)。
  • 對複雜結(jié)構(gòu)體(如嵌套結(jié)構(gòu)、聯(lián)合體)的支持正在完善。
  • 跨平臺兼容性需注意庫名和調(diào)用約定(如Windows 的stdcall)。

  • 基本上就這些。 Foreign Function & Memory API 是Java 向系統(tǒng)級編程邁出的重要一步,標(biāo)誌著Java 正在變得更“貼近硬件”,同時保持安全與簡潔。對於需要高性能本地調(diào)用的場景(如數(shù)據(jù)庫、AI 庫集成、操作系統(tǒng)工具),它將逐漸成為首選方案。

    以上是Java中的外部功能和內(nèi)存API 21的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

用雅加達(dá)EE在Java建立靜止的API 用雅加達(dá)EE在Java建立靜止的API Jul 30, 2025 am 03:05 AM

SetupaMaven/GradleprojectwithJAX-RSdependencieslikeJersey;2.CreateaRESTresourceusingannotationssuchas@Pathand@GET;3.ConfiguretheapplicationviaApplicationsubclassorweb.xml;4.AddJacksonforJSONbindingbyincludingjersey-media-json-jackson;5.DeploytoaJakar

Java項(xiàng)目管理Maven的開發(fā)人員指南 Java項(xiàng)目管理Maven的開發(fā)人員指南 Jul 30, 2025 am 02:41 AM

Maven是Java項(xiàng)目管理和構(gòu)建的標(biāo)準(zhǔn)工具,答案在於它通過pom.xml實(shí)現(xiàn)項(xiàng)目結(jié)構(gòu)標(biāo)準(zhǔn)化、依賴管理、構(gòu)建生命週期自動化和插件擴(kuò)展;1.使用pom.xml定義groupId、artifactId、version和dependencies;2.掌握核心命令如mvnclean、compile、test、package、install和deploy;3.利用dependencyManagement和exclusions管理依賴版本與衝突;4.通過多模塊項(xiàng)目結(jié)構(gòu)組織大型應(yīng)用並由父POM統(tǒng)一管理;5.配

CSS暗模式切換示例 CSS暗模式切換示例 Jul 30, 2025 am 05:28 AM

首先通過JavaScript獲取用戶系統(tǒng)偏好和本地存儲的主題設(shè)置,初始化頁面主題;1.HTML結(jié)構(gòu)包含一個按鈕用於觸發(fā)主題切換;2.CSS使用:root定義亮色主題變量,.dark-mode類定義暗色主題變量,並通過var()應(yīng)用這些變量;3.JavaScript檢測prefers-color-scheme並讀取localStorage決定初始主題;4.點(diǎn)擊按鈕時切換html元素上的dark-mode類,並將當(dāng)前狀態(tài)保存至localStorage;5.所有顏色變化均帶有0.3秒過渡動畫,提升用戶

CSS下拉菜單示例 CSS下拉菜單示例 Jul 30, 2025 am 05:36 AM

是的,一個常見的CSS下拉菜單可以通過純HTML和CSS實(shí)現(xiàn),無需JavaScript。 1.使用嵌套的ul和li構(gòu)建菜單結(jié)構(gòu);2.通過:hover偽類控制下拉內(nèi)容的顯示與隱藏;3.父級li設(shè)置position:relative,子菜單使用position:absolute進(jìn)行定位;4.子菜單默認(rèn)display:none,懸停時變?yōu)閐isplay:block;5.可通過嵌套實(shí)現(xiàn)多級下拉,結(jié)合transition添加淡入動畫,配合媒體查詢適配移動端,整個方案簡潔且無需JavaScript支持,適合大

如何將Java MistageDigest用於哈希(MD5,SHA-256)? 如何將Java MistageDigest用於哈希(MD5,SHA-256)? Jul 30, 2025 am 02:58 AM

要使用Java生成哈希值,可通過MessageDigest類實(shí)現(xiàn)。 1.獲取指定算法的實(shí)例,如MD5或SHA-256;2.調(diào)用.update()方法傳入待加密數(shù)據(jù);3.調(diào)用.digest()方法獲取哈希字節(jié)數(shù)組;4.將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)製字符串以便讀?。粚洞笪募容斎?,應(yīng)分塊讀取並多次調(diào)用.update();推薦使用SHA-256而非MD5或SHA-1以確保安全性。

Python Parse Date String示例 Python Parse Date String示例 Jul 30, 2025 am 03:32 AM

使用datetime.strptime()可將日期字符串轉(zhuǎn)換為datetime對象,1.基本用法:通過"%Y-%m-%d"解析"2023-10-05"為datetime對象;2.支持多種格式如"%m/%d/%Y"解析美式日期、"%d/%m/%Y"解析英式日期、"%b%d,%Y%I:%M%p"解析帶AM/PM的時間;3.可用dateutil.parser.parse()自動推斷未知格式;4.使用.d

VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級或工作區(qū)級路徑,用於自定義VSCode設(shè)置。 1.用戶級路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級路徑:項(xiàng)目根目錄下的.vscode/settings

崇高文本自動關(guān)閉HTML標(biāo)籤 崇高文本自動關(guān)閉HTML標(biāo)籤 Jul 30, 2025 am 02:41 AM

安裝Emmet插件可實(shí)現(xiàn)智能自動閉合標(biāo)籤並支持縮寫語法;2.啟用"auto_match_enabled":true讓Sublime自動補(bǔ)全簡單標(biāo)籤;3.使用Alt .(Win)或Ctrl Shift .(Mac)快捷鍵手動閉合當(dāng)前標(biāo)籤——推薦日常使用Emmet,輕量需求可用後兩種方式組合,效率足夠且設(shè)置簡單。

See all articles