0Pricing
Java Academy · Pelajaran

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 JNIEXPORT yang 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:

  • Linker dan SymbolLookup untuk menemukan serta mengikat fungsi
  • MemorySegment untuk memori asli
  • Arena untuk masa hidup yang deterministik
  • MemoryLayout dan FunctionDescriptor untuk 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.Unsafe dan dapat dipadukan dengan jextract

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

  1. Mengapa FFM, bukan JNI
  2. MemorySegment dan Arena
  3. Handle Downcall
  4. Layout dan Struct
← Kembali ke Java Academy