」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 外部函數和記憶體 API 簡介(巴拿馬專案)

外部函數和記憶體 API 簡介(巴拿馬專案)

發佈於2024-08-06
瀏覽:723

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]刪除
最新教學 更多>
  • 為什麼我放棄 Python Flask 而選擇 Django:Web 框架對決
    為什麼我放棄 Python Flask 而選擇 Django:Web 框架對決
    當您開始使用 Python Web 開發時,您可能會遇到 Django 和 Python Flask 作為兩個最佳選擇。這兩個框架都有其優點,但根據我的經驗,Django 通常是更好的選擇。 我早期使用 Python Flask 的經歷 當我第一次開始探索 Web 開發時,Pyth...
    程式設計 發佈於2024-11-08
  • React原始碼中MessageChannel的使用
    React原始碼中MessageChannel的使用
    這篇文章我們分析React原始碼中MessageChannel的用法。 我們先來了解什麼是MessageChannel。 訊息頻道 Channel Messaging API 的 MessageChannel 介面允許我們建立一個新的訊息通道並透過它的兩個 MessagePort...
    程式設計 發佈於2024-11-08
  • 掌握 Java 單元測試:&#Student Class Test&# 項目
    掌握 Java 單元測試:&#Student Class Test&# 項目
    透過 LabEx 的學生類測試專案深入單元測試的世界,釋放您作為 Java 開發人員的潛力。這門綜合課程將引導您完成為簡單的 Student 類別編寫有效單元測試的過程,使您能夠編寫更可靠和可維護的程式碼。 介紹 在不斷發展的軟體開發領域,編寫健全且經過良好測試的程式碼的能力變得越...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中模擬屬性的 noSuchMethod 功能?
    如何在 JavaScript 中模擬屬性的 noSuchMethod 功能?
    如何在JavaScript 中實現noSuchMethod 屬性功能在JavaScript 中,noSuchMethod在JavaScript 中,noSuchMethod雖然標準 JavaScript 語言中的屬性沒有直接等效項,但可以模擬類似的屬性使用 ECMAScript 6 代理程式的功能。...
    程式設計 發佈於2024-11-08
  • 使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    通过 Databricks 中的流程自动化降低成本 我的客户需要降低在 Databricks 上运行的流程的成本。 Databricks 负责的功能之一是从各种 SFTP 收集文件,解压缩它们并将它们放入数据湖中。 自动化数据工作流程是现代数据工程的重要组成部分。在本文中,我们将探...
    程式設計 發佈於2024-11-08
  • 為什麼我的 GoLang 網路伺服器無法提供大型 MP4 影片?
    為什麼我的 GoLang 網路伺服器無法提供大型 MP4 影片?
    GoLang HTTP Webserver Serving MP4 Video挑戰使用 GoLang 創建了一個提供 HTML/JS/CSS 和映像的 Web 伺服器。當伺服器嘗試提供 MP4 視訊檔案時,視訊載入失敗,僅顯示視訊控制。 調查檢查視訊檔案後,發現較小的視訊可以正常工作,而較大的視訊則...
    程式設計 發佈於2024-11-08
  • 如何在不使用 HTML 表單的情況下使用 PHP 重新導向網頁並傳送 POST 資料?
    如何在不使用 HTML 表單的情況下使用 PHP 重新導向網頁並傳送 POST 資料?
    使用PHP 重定向和發送POST 資料在這個問題中,我們遇到了一個獨特的挑戰:如何重定向網頁並透過POST 方法不依賴HTML 表單。期望的結果是使用 PHP 腳本將隱藏欄位提交到外部網關。通常,透過GET 傳送資料非常簡單,如下面的程式碼片段所示:header('Location: http://...
    程式設計 發佈於2024-11-08
  • 如何處理JSF表單提交過程中的授權失敗?
    如何處理JSF表單提交過程中的授權失敗?
    JSF 表單提交期間的授權失敗:綜合分析在JSF 應用程式中實現自訂授權機制時,了解頁面導航和表單提交之間的區別至關重要。雖然重定向可以無縫地進行頁面導航,但它們在表單提交期間可能會遇到問題。 問題原因此問題的根本原因在於 JSF 表單提交觸發非同步請求。當發送重定向作為對非同步請求的回應時,JSF...
    程式設計 發佈於2024-11-08
  • 如何有效管理多個 JavaScript 和 CSS 檔案以獲得最佳頁面效能?
    如何有效管理多個 JavaScript 和 CSS 檔案以獲得最佳頁面效能?
    管理多個JavaScript 和CSS 檔案:最佳實踐組織過多的JavaScript 和CSS 檔案可能會帶來挑戰,特別是在保持最佳頁面性能方面。下面列出了有效解決此問題的最佳實踐。 PHP Minify:簡化 HTTP 請求不要載入大量單獨的文件,而是考慮使用 PHP Minify。該工具將多個 ...
    程式設計 發佈於2024-11-08
  • 我的 Amazon SDE 面試經驗 – 5 月 4 日
    我的 Amazon SDE 面試經驗 – 5 月 4 日
    我的 Amazon SDE 面试经历 – 2024 年 5 月 2024 年 5 月,我有机会面试亚马逊的软件开发工程师 (SDE) 职位。这一切都始于一位招聘人员通过 LinkedIn 联系我。我很惊喜,因为它总是令人兴奋。 一切是如何开始的 招聘人员专业且清晰,...
    程式設計 發佈於2024-11-08
  • 如何在 cURL POST 請求中傳送多個影像?
    如何在 cURL POST 請求中傳送多個影像?
    在cURL POST 請求中使用陣列在嘗試使用cURL 傳送影像陣列時,使用者可能會遇到僅第一個影像的問題傳輸數組值。這個問題探討如何修正這個問題。 原始程式碼似乎在陣列結構上有一個小缺陷。要解決此問題,建議使用 http_build_query 來正確格式化陣列:$fields = array( ...
    程式設計 發佈於2024-11-08
  • 為什麼 $_POST 中的 Axios POST 資料不可存取?
    為什麼 $_POST 中的 Axios POST 資料不可存取?
    Axios Post 參數未由$_POST 讀取您正在使用Axios 將資料發佈到PHP 端點,並希望在$ 中存取它_POST 或$_REQUEST。但是,您目前無法檢測到它。 最初,您使用了預設的 axios.post 方法,但由於懷疑標頭問題而切換到提供的程式碼片段。儘管發生了這種變化,數據仍然...
    程式設計 發佈於2024-11-08
  • ## JPQL 中的建構函數表達式:使用還是不使用?
    ## JPQL 中的建構函數表達式:使用還是不使用?
    JPQL 中的建構子表達式:有益或有問題的實踐? JPQL 提供了使用建構函式表達式在 select 語句中建立新物件的能力。雖然此功能提供了某些優勢,但它引發了關於其在軟體開發實踐中是否適用的問題。 建構函數表達式的優點建構函數表達式允許開發人員從實體中提取特定資料並進行組裝,從而簡化了資料檢索將...
    程式設計 發佈於2024-11-08
  • 原型
    原型
    創意設計模式之一。 用於建立給定物件的重複/淺副本。 當直接建立物件成本高昂時,此模式很有用,例如:如果在查詢大型資料庫後建立對象,則一次又一次地建立該物件在效能方面並不經濟。 因此,一旦創建了對象,我們就緩存該對象,並且在將來需要相同的對象時,我們從緩存中獲取它,而不是從數據庫中再次創建它,...
    程式設計 發佈於2024-11-08
  • Python 變數:命名規則和型別推斷解釋
    Python 變數:命名規則和型別推斷解釋
    Python 是一種廣泛使用的程式語言,以其簡單性和可讀性而聞名。了解變數的工作原理是編寫高效 Python 程式碼的基礎。在本文中,我們將介紹Python變數命名規則和類型推斷,確保您可以編寫乾淨、無錯誤的程式碼。 Python變數命名規則 在Python中命名變數時,必須遵循一...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3