Java Academy · Pelajaran

Mengapa FFM berbanding JNI

Saling kendali natif yang lebih selamat

Pelajaran 1 daripada 413 langkah

Mengapa FFM berbanding JNI ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Memanggil Kod Natif

Java kadangkala perlu memanggil pustaka C atau bekerja dengan memori luar timbunan. Cara klasik ialah Antara Muka Natif Java (JNI). Cara moden ialah API Fungsi Asing dan Memori (FFM), yang dimuktamadkan dalam Java 22 (JEP 454).

Pelajaran ini menerangkan sebab FFM merupakan pilihan yang lebih baik.

Keperluan JNI

JNI menyusahkan:

  • Menulis kod penghubung C dengan tandatangan JNIEXPORT yang janggal
  • Mengkompil pustaka natif dikongsi yang berasingan bagi setiap platform
  • Menukar antara jenis Java dan C secara manual
  • Kesilapan kecil boleh menyebabkan JVM ranap dengan mudah

FFM ialah Java Tulen

FFM membolehkan anda memanggil fungsi natif dan mengakses memori natif sepenuhnya daripada Java. Tiada kod penghubung C, tiada langkah kompilasi berasingan dan tiada penyusunan format secara manual.

Anda menerangkan tandatangan fungsi natif dalam Java dan memanggilnya melalui pemegang kaedah.

Pakej Utama

Segala-galanya berada dalam java.lang.foreign. Jenis utamanya ialah:

  • Linker dan SymbolLookup untuk mencari serta mengikat fungsi
  • MemorySegment untuk memori natif
  • Arena untuk jangka hayat yang boleh ditentukan
  • MemoryLayout dan FunctionDescriptor untuk menerangkan bentuk

Lebih Selamat melalui Reka Bentuk

FFM jauh lebih selamat berbanding JNI:

  • Akses memori dengan semakan sempadan
  • Jangka hayat terikat pada Arena, maka penggunaan selepas pembebasan dapat dikesan
  • Pembatasan akses menghalang capaian merentas utas yang tidak selamat

Kesilapan menghasilkan pengecualian Java dan bukannya menyebabkan VM ranap.

Pengenalan Ringkas kepada API

Lakaran ini mencari fungsi C strlen dan menyediakan pemegang untuknya. Intinya, semuanya ialah kod Java biasa.

import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;

public class Main {
    public static void main(String[] args) {
        Linker linker = Linker.nativeLinker();
        SymbolLookup stdlib = linker.defaultLookup();
        MethodHandle strlen = linker.downcallHandle(
            stdlib.find("strlen").orElseThrow(),
            FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));
        System.out.println("Bound a handle to strlen: " + strlen);
    }
}

Prestasi

Panggilan ke bawah FFM setanding dengan JNI dan sering lebih pantas kerana pengkompil masa nyata boleh menyisipkan kod sebaris serta mengoptimumkan rintisan yang dijana. Tiada trampolin C bagi setiap panggilan untuk dilalui.

Mendayakan Capaian Natif

Oleh sebab kod natif boleh berbahaya, FFM mungkin memberikan amaran atau memerlukan pengaktifan pilihan. Anda memberikan capaian semasa pelancaran dengan --enable-native-access=ALL-UNNAMED (atau nama modul tertentu) untuk menyenyapkan amaran.

Menggantikan sun.misc.Unsafe

FFM (bersama API Memori) juga merupakan pengganti yang disokong untuk operasi memori luar timbunan sun.misc.Unsafe yang telah lama tidak digunakan. Pustaka yang mengurus penimbal natif secara manual boleh beralih kepada API yang selamat dan disokong.

Alat: jextract

Untuk pustaka C yang besar, alat pelengkap jextract membaca fail pengepala C dan menjana pengikatan FFM Java secara automatik. Anda tidak perlu menulis deskriptor secara manual.

Ia ialah pelengkap produktiviti kepada FFM, sama seperti penjana kod.

Bila Menggunakan FFM

Gunakan FFM apabila anda perlu:

  • Memanggil pustaka C/C++ sedia ada
  • Berinteraksi dengan OS pada tahap rendah
  • Mengurus penimbal luar timbunan yang besar dengan cekap

Untuk kerja Java tulen, anda tidak memerlukannya.

Semakan Ringkas

Ingat kembali kelebihan utama berbanding JNI.

Imbas Kembali

Anda telah mempelajari sebab FFM lebih baik daripada JNI:

  • Java tulen, tanpa kod pelekat C atau kompilasi tambahan
  • Selamat: semakan sempadan, jangka hayat Arena dan pembatasan akses
  • Prestasi setanding atau lebih baik
  • Menggantikan sun.misc.Unsafe; digandingkan dengan jextract

Seterusnya: mengurus memori natif dengan MemorySegment dan Arena.

Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Mengapa FFM berbanding JNI” percuma?

Ya — teks penuh “Mengapa FFM berbanding JNI” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengapa FFM berbanding JNI”?

Saling kendali natif yang lebih selamat Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Mengapa FFM berbanding JNI” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengapa FFM berbanding JNI
  2. MemorySegment dan Arena
  3. Pemegang Downcall
  4. Susun Atur dan Struct
← Kembali ke Java Academy