Mengapa FFM, bukan JNI
Interoperabilitas native yang lebih aman.
Mengapa FFM, bukan JNI adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Memanggil Kode Asli
Java terkadang perlu memanggil pustaka C atau bekerja dengan memori di luar heap. Cara klasiknya adalah Antarmuka Asli Java (JNI). Cara modernnya adalah API Fungsi Asing dan Memori (FFM), yang ditetapkan secara final pada Java 22 (JEP 454).
Pelajaran ini menjelaskan alasan FFM merupakan pilihan yang lebih baik.
Hal yang Dibutuhkan JNI
JNI merepotkan:
- Menulis kode penghubung C dengan deklarasi
JNIEXPORTyang rumit - Mengompilasi pustaka asli bersama untuk setiap platform
- Mengubah tipe Java dan C secara manual
- Kesalahan kecil dapat dengan mudah membuat JVM mogok
FFM Sepenuhnya Berbasis Java
FFM memungkinkan Anda memanggil fungsi asli dan mengakses memori asli sepenuhnya dari Java. Tanpa kode penghubung C, tanpa langkah kompilasi terpisah, dan tanpa pengemasan data yang ditulis secara manual.
Anda menjelaskan bentuk fungsi asli dalam Java dan memanggilnya melalui penangan metode.
Paket-Paket Utama
Semua tersedia dalam java.lang.foreign. Tipe-tipe utamanya adalah:
LinkerdanSymbolLookupuntuk menemukan serta mengikat fungsiMemorySegmentuntuk memori asliArenauntuk masa hidup yang deterministikMemoryLayoutdanFunctionDescriptoruntuk menjelaskan struktur
Lebih Aman sejak Perancangan
FFM jauh lebih aman daripada JNI:
- Akses memori dengan pemeriksaan batas
- Masa hidup terikat pada
Arena, sehingga penggunaan setelah dibebaskan dapat terdeteksi - Pembatasan akses mencegah akses lintas utas yang tidak aman
Kesalahan akan memunculkan pengecualian Java, bukan membuat VM mogok.
Sekilas tentang API
Sketsa ini menemukan fungsi C strlen dan menyiapkan referensi untuk memanggilnya. Intinya, semua ini hanyalah kode 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);
}
}Performa
Panggilan ke fungsi natif melalui FFM mampu bersaing dengan JNI dan sering kali lebih cepat karena JIT dapat memasukkan pemanggilan ke dalam kode dan mengoptimalkan kode perantara yang dihasilkan. Tidak ada trampolin C yang harus dilewati pada setiap pemanggilan.
Mengaktifkan Akses Natif
Karena kode natif dapat berbahaya, FFM mungkin menampilkan peringatan atau mengharuskan Anda memberikan persetujuan eksplisit. Anda memberikan akses saat peluncuran dengan --enable-native-access=ALL-UNNAMED (atau nama modul tertentu) untuk menonaktifkan peringatan.
Menggantikan sun.misc.Unsafe
FFM (bersama API Memori) juga merupakan pengganti resmi untuk operasi di luar heap pada sun.misc.Unsafe yang sudah lama tidak digunakan lagi. Pustaka yang sebelumnya mengelola penyangga natif secara manual dapat beralih ke API yang aman dan didukung.
Peralatan: jextract
Untuk pustaka C yang besar, alat pendamping jextract membaca berkas header C dan membuat binding FFM Java secara otomatis. Anda tidak perlu menulis deskriptor secara manual.
Alat ini merupakan pasangan produktivitas FFM, seperti pembuat kode.
Kapan Menggunakan FFM
Gunakan FFM ketika Anda harus:
- Memanggil pustaka C/C++ yang sudah ada
- Berinteraksi dengan OS pada tingkat rendah
- Mengelola penyangga besar di luar heap secara efisien
Untuk pekerjaan Java murni, Anda tidak pernah membutuhkannya.
Pemeriksaan Singkat
Ingat kembali keunggulan utama FFM dibandingkan JNI.
Ringkasan
Anda telah mempelajari alasan FFM lebih unggul daripada JNI:
- Java murni, tanpa kode penghubung C atau kompilasi tambahan
- Aman: pemeriksaan batas, masa hidup Arena, dan pembatasan akses
- Performa yang mampu bersaing atau lebih baik
- Menggantikan
sun.misc.Unsafedan dapat dipadukan denganjextract
Selanjutnya: mengelola memori natif dengan MemorySegment dan Arena.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengapa FFM, bukan JNI” gratis?
Ya — teks lengkap “Mengapa FFM, bukan JNI” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengapa FFM, bukan JNI”?
Interoperabilitas native yang lebih aman. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Mengapa FFM, bukan JNI” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa FFM, bukan JNI
- MemorySegment dan Arena
- Handle Downcall
- Layout dan Struct