Java 21 memperkenalkan API Fungsi & Memori Asing untuk menyelesaikan kerumitan, keselamatan yang lemah, dan overhead prestasi besar JNI; 2. Komponen teras termasuk memori (abstraksi memori), valuelayout/memoriLayout (susun atur memori), Symbollookup (fungsi simbol fungsi), fungsiDescriptor dan MethodHandle (definisi panggilan fungsi), arena (pengurusan hayat memori); 3. Kod Java Pure boleh memanggil fungsi tempatan dan mengendalikan memori luar-hapas dengan selamat dan cekap, tanpa menulis kod C atau mengurus memori secara manual; 4. Berbanding dengan JNI, API FFM menyediakan keselamatan jenis yang lebih kuat, pengurusan memori automatik, prestasi yang lebih baik dan keselamatan yang lebih tinggi; 5. Pada masa ini di Java ciri pratonton dalam 21 memerlukan Pred-Preview. Ia tidak disyorkan untuk digunakan dalam persekitaran pengeluaran dan dijangka akan dikeluarkan secara rasmi dalam versi berikutnya.
Java 21 memperkenalkan API Fungsi & Memori Asing (FFM API), satu ciri baru yang penting yang direka untuk membolehkan program Java dengan selamat dan cekap memanggil perpustakaan tempatan (seperti perpustakaan pautan dinamik yang ditulis dalam C/C) dan berinteraksi dengan memori luar. Ia menggantikan JNI yang lama tetapi bermasalah (antara muka asli Java), menyediakan cara yang lebih moden, ringkas dan selamat untuk mengendalikan interoperabilitas dengan kod asli.

Matlamat utama API ini adalah untuk membolehkan Java mengakses fungsi dan ingatan tempatan secara semulajadi seperti memanggil kaedah tempatan, sambil mengelakkan kerumitan dan risiko keselamatan JNI.
1. Mengapa anda memerlukan API Fungsi & Memori Asing?
Sebelum Java 21, berinteraksi dengan kod asli terutamanya bergantung kepada JNI , tetapi ia mempunyai banyak masalah:

- Kompleks dan rumit : Ia memerlukan menulis kod C, menjana fail header, menyusun perpustakaan bersama, dan proses pembangunan tidak lancar.
- Ralat ralat : Mengurus memori dan jenis penukaran secara manual dengan mudah boleh menyebabkan kemalangan (seperti Segfaults).
- Overhead Prestasi : Panggilan JNI mempunyai kos penukaran konteks yang tinggi.
- Keselamatan yang lemah : Operasi langsung petunjuk, kekurangan pemeriksaan akses memori.
Kemunculan API Fungsi & Memori Asing adalah untuk menyelesaikan masalah ini dan menyediakan cara Java tulen untuk melaksanakan panggilan fungsi luaran dan operasi ingatan.
2. Penjelasan terperinci mengenai komponen teras
API FFM kebanyakannya terdiri daripada kelas utama berikut, yang terletak di java.lang.foreign
Package:

1. Memorysegment: Abstraksi Memori Luar Heap
MemorySegment
mewakili kawasan memori yang berterusan, yang boleh masuk atau keluar dari timbunan, atau memori tempatan. Ia adalah enkapsulasi ingatan mentah yang selamat.
// memperuntukkan 100 bait memori luar-hap (segmen memori = memoriSegment.allocatenative (100)) { segmen.set (java_int, 0, 42); // tulis int pada offset 0 int value = segment.get (java_int, 0); // baca System.out.println (nilai); // output 42 }
- Gunakan
allocateNative()
untuk memperuntukkan memori tempatan. - Gunakan kaedah
set()
/get()
untuk bekerjasama denganValueLayout
(sepertiJAVA_INT
) untuk membaca dan menulis yang ditaip. - Ia mesti digunakan dalam
try-with-resources
untuk memastikan memori itu dikeluarkan dalam masa.
2. Valuelayout dan MemoryLayout: Definisi susun atur memori
Digunakan untuk menggambarkan susun atur struktur data, seperti jenis asas, struktur, tatasusunan, dll.
VALUELAYOUT.OFINT INT = VALUELAYOUT.JAVA_INT; SequenceLayout ArrayLayout = MemoryLayout.SequenceLayout (10, int); // int [10]
Susun atur ini boleh digunakan untuk membina jenis parameter fungsi atau peta struktur.
3. Symbollookup: Cari Simbol Fungsi Tempatan
Digunakan untuk mencari alamat fungsi dalam perpustakaan dinamik.
Symbollookup lookup = symbollookup.librarylookup ("libc.so.6"); // linux // atau symbollookup.librarylookup ("msvcrt.dll") di Windows
4. FunctionDescriptor dan Methodhandle: Tentukan dan panggil fungsi luaran
FunctionDescriptor
menerangkan parameter dan jenis pulangan fungsi, dan menggabungkan Linker
untuk mendapatkan MethodHandle
yang boleh dipanggil.
Contoh: Memanggil printf
of C
import java.lang.Foreign.*; import statik java.lang.foreign.valuelayout.*; Linker Linker = Linker.NativeLinker (); Symbollookup stdlib = linker.defaultlookup (); // Tentukan tandatangan fungsi printf: int printf (const char*, ...) FunctionDescriptor printFDesc = functionDescriptor.of (java_int, alamat); MethodHandle printf = linker.downCallHandle (stdlib.find ("printf"). Orelsethrow (), printFDesc); // Sediakan rentetan (mesti berakhir dengan null) cuba (arena arena = arena.ofconfined ()) { Format MemorySegment = arena.allocateFrom ("Hello from %s! \ N"); Nama MemorySegment = Arena.AllococRrom ("FFM API"); // Call Printf printf.invoke (format, nama); }
Output:
Helo dari FFM API!
Nota: Fungsi parameter pembolehubah menyokong sokongan terhad. Dalam contoh ini, hanya dua parameter yang diluluskan, jadi anda perlu berhati -hati apabila menggunakannya.
3. Memanggil perpustakaan tempatan tersuai (contoh mudah)
Katakan anda mempunyai fungsi C:
// libadd.so (linux) / add.dll (Windows) int tambah (int a, int b) { kembali AB; }
Setelah menyusun perpustakaan bersama, panggilnya di Java:
cuba (arena arena = arena.ofconfined ()) { Linker Linker = Linker.NativeLinker (); Symbollookup lookup = linker.defaultlookup (); // atau tentukan fungsi PathDescriptor addDesc = functionDescriptor.of (java_int, java_int, java_int); MethodHandle Add = Linker.DownCallHandle ( lookup.find ("tambah"). Orelsethrow (), adddesc ); int hasil = (int) add.invoke (3, 4); System.out.println ("3 4 =" hasil); // output 7 }
Tidak perlu menulis kod JNI, ia dilakukan sepenuhnya di lapisan Java.
Iv. Arena: Pengurusan kitaran hayat ingatan
Java 21 memperkenalkan konsep arena untuk menyatukan kitaran hayat MemorySegment
.
-
Arena.ofConfined()
: Akses benang tunggal, prestasi yang baik. -
Arena.ofShared()
: perkongsian pelbagai threaded, lebih selamat tetapi dengan overhead penyegerakan.
cuba (arena arena = arena.ofconfined ()) { MemoriSegment seg = arena.allocate (100); // Gunakan seg ... } // melepaskan semua memori secara automatik
Ini adalah mekanisme utama untuk mencegah kebocoran ingatan.
5. Kelebihan berbanding dengan JNI
ciri | Jni | FFM API |
---|---|---|
Adakah anda memerlukan kod asli? | Ya | tidak |
Pengurusan memori | Manual (terdedah kepada kesilapan) | Pengurusan Automatik Arena |
Jenis keselamatan | Lemah (definisi makro) | Kuat (Valaseelayout) |
prestasi | Umumnya, overhead panggilan tinggi | Lebih baik, JVM dapat dioptimumkan |
Kemudahan penggunaan | kompleks | Jawa yang sederhana, tulen |
Keselamatan | Rendah (penunjuk langsung) | Tinggi (cek sempadan) |
6. Status dan langkah berjaga -jaga semasa
- Ciri pratonton masih dalam Java 21 , dan pilihan pratonton perlu diaktifkan:
Javac-Release 21-Tenable-Preview Yourclass.java Java-yang boleh dipamerkan Yourclass
- API boleh diselaraskan pada masa akan datang dan tidak disyorkan untuk digunakan dalam persekitaran pengeluaran sehingga mereka menjadi kekal (Java 22 atau 23 dijangka).
- Sokongan untuk struktur kompleks (seperti struktur bersarang, kesatuan) sedang diperbaiki.
- Keserasian silang platform memerlukan perhatian kepada nama perpustakaan dan menelefon konvensyen (seperti STDCall untuk Windows).
Pada dasarnya itu sahaja. API Fungsi & Memori Asing adalah langkah penting bagi Java untuk pengaturcaraan peringkat sistem, menandakan bahawa Java menjadi lebih "dekat dengan perkakasan" sambil tetap selamat dan ringkas. Ia secara beransur-ansur akan menjadi penyelesaian pilihan untuk senario yang memerlukan panggilan tempatan berprestasi tinggi (seperti pangkalan data, integrasi perpustakaan AI, alat sistem operasi).
Atas ialah kandungan terperinci API Fungsi & Memori Asing di Java 21. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

SetupaMaven/gradleprojectwithjax-rsdependencyiSejersey; 2.createarescresourceUsingAnnotationssuchas@pathand@get; 3.configuretheapplicationviaapplicationsubclassorweb.xml;

Maven adalah alat standard untuk pengurusan dan pembinaan projek Java. Jawapannya terletak pada hakikat bahawa ia menggunakan pom.xml untuk menyeragamkan struktur projek, pengurusan pergantungan, automasi kitaran hayat pembinaan dan sambungan pemalam; 1. Gunakan pom.xml untuk menentukan kumpulan, artifactid, versi dan kebergantungan; 2. Perintah teras utama seperti mvnclean, penyusun, ujian, pakej, memasang dan menggunakan; 3. Gunakan DependencyManagement dan Pengecualian untuk Menguruskan Versi Ketergantungan dan Konflik; 4. Mengatur aplikasi besar melalui struktur projek multi-modul dan diuruskan secara seragam oleh POM induk; 5.

Pertama, gunakan JavaScript untuk mendapatkan pilihan sistem pengguna dan tetapan tema yang disimpan di dalam negara, dan memulakan tema halaman; 1. Struktur HTML mengandungi butang untuk mencetuskan Topik Switching; 2. CSS menggunakan: Root untuk menentukan pembolehubah tema yang cerah, kelas mod-mode mentakrifkan pembolehubah tema gelap, dan menggunakan pembolehubah ini melalui VAR (); 3. JavaScript mengesan lebih suka skema-skema dan membaca LocalStorage untuk menentukan tema awal; 4. Tukar kelas mod gelap pada elemen HTML apabila mengklik butang, dan menjimatkan keadaan semasa ke LocalStorage; 5. Semua perubahan warna disertakan dengan animasi peralihan 0.3 saat untuk meningkatkan pengguna

Ya, menu drop-down CSS biasa boleh dilaksanakan melalui HTML dan CSS tulen tanpa JavaScript. 1. Gunakan UL dan Li bersarang untuk membina struktur menu; 2. Gunakan: Hover pseudo-Class untuk mengawal paparan dan menyembunyikan kandungan tarik-turun; 3. Tetapkan Kedudukan: Relatif untuk Ibu Bapa Li, dan submenu diletakkan menggunakan kedudukan: mutlak; 4. Submenu mungkir untuk memaparkan: Tiada, yang menjadi paparan: blok apabila melayang; 5. Multi-level pull-down boleh dicapai melalui bersarang, digabungkan dengan peralihan, dan menambah animasi pudar, dan disesuaikan dengan terminal mudah alih dengan pertanyaan media. Penyelesaian keseluruhannya mudah dan tidak memerlukan sokongan JavaScript, yang sesuai untuk besar

Untuk menjana nilai hash menggunakan Java, ia boleh dilaksanakan melalui kelas MessageDigest. 1. Dapatkan contoh algoritma yang ditentukan, seperti MD5 atau SHA-256; 2. Panggil kaedah .Update () untuk lulus dalam data untuk disulitkan; 3. Panggil kaedah .digest () untuk mendapatkan pelbagai hash byte; 4. Tukar array byte ke dalam rentetan heksadesimal untuk membaca; Untuk input seperti fail besar, baca dalam ketulan dan panggilan .Update () beberapa kali; Adalah disyorkan untuk menggunakan SHA-256 dan bukannya MD5 atau SHA-1 untuk memastikan keselamatan.

Gunakan DateTime.StrpTime () untuk menukar rentetan tarikh ke dalam objek DateTime. 1. Penggunaan Asas: Parse "2023-10-05" sebagai objek DateTime melalui "%y-%m-%d"; 2. Menyokong pelbagai format seperti "%m/%d/%y" untuk menghuraikan tarikh Amerika, "%d/%m/%y" untuk menghuraikan tarikh British, "%b%d,%y%i:%m%p" untuk menghuraikan masa dengan am/pm; 3. Gunakan dateUtil.parser.parse () untuk secara automatik menyimpulkan format yang tidak diketahui; 4. Gunakan .D

Fail Tetapan.JSON terletak di laluan peringkat pengguna atau ruang kerja dan digunakan untuk menyesuaikan tetapan vscode. 1. Laluan peringkat pengguna: Windows adalah C: \ Users \\ AppData \ Roaming \ code \ user \ settings.json, macOS adalah /users//library/applicationsupport/code/user/settings.json, linux adalah/ 2. Laluan Tahap Ruang Kerja: .VSCODE/Tetapan dalam Direktori Root Projek

Memasang plug-in Emmet boleh mencapai penutupan automatik pintar tag dan sintaks singkatan sokongan; 2. Dayakan "AUTO_MATCH_ENABLED": benar untuk membolehkan SUBLIME untuk melengkapkan tag mudah secara automatik; 3. Gunakan alt. (Menang) atau peralihan CTRL. (Mac) Kekunci pintasan untuk menutup secara manual tag semasa - disyorkan untuk menggunakan Emmet dalam kehidupan seharian. Dua kaedah yang terakhir boleh digabungkan, yang cekap dan mudah untuk ditetapkan.
