Interface Native Java (JNI) dijelaskan dengan contoh
Jul 28, 2025 am 12:20 AMJNI membenarkan kod Java untuk berinteraksi dengan kod tempatan yang ditulis dalam C/C dan bahasa lain, dan melaksanakannya sebagai perpustakaan yang dikongsi dengan mengisytiharkan kaedah asli, menghasilkan fail header, menulis dan menyusun C sebagai perpustakaan bersama, memuatkan perpustakaan dan menjalankan program untuk mencapai panggilan; 2. Data ditukar antara Java dan jenis tempatan melalui fungsi JNI, seperti JSTRING dan CHAR*; 3. Kod tempatan boleh memanggil semula kaedah Java, dan anda perlu mendapatkan rujukan kelas, ID kaedah dan menggunakan fungsi seperti CallVoidMethod; 4. Perhatikan spesifikasi penamaan, pemeriksaan pengecualian, pengurusan memori, keselamatan benang dan prestasi overhead apabila menggunakannya; 5. Ia sesuai untuk mengakses sumber sistem, menggunakan semula perpustakaan asli atau meningkatkan prestasi, tetapi harus dielakkan apabila Java tulen dapat menyelesaikan atau menekankan kebolehpercayaan; JNI adalah alat yang kuat tetapi berhati -hati, dan aplikasi yang betul dapat mengembangkan keupayaan Java dengan ketara.
Antara Muka Native Java (JNI) membolehkan kod Java berjalan dalam mesin maya Java (JVM) untuk berinteraksi dengan aplikasi asli dan perpustakaan yang ditulis dalam bahasa lain seperti C, C, atau pemasangan. Ini berguna apabila anda perlu mengakses sumber peringkat sistem, memanfaatkan kod asli yang sedia ada, atau meningkatkan prestasi untuk tugas-tugas yang kuat.

Walaupun Java direka untuk menjadi platform bebas, JNI memperkenalkan kebergantungan khusus platform-tetapi ia memberi anda kawalan tahap rendah yang kuat apabila diperlukan.
Mari kita pecahkan bagaimana JNI berfungsi, langkah demi langkah, dengan contoh praktikal.

? Bagaimana JNI Berfungsi: Gambar Besar
JNI bertindak sebagai jambatan antara Java dan kod asli:
- Java memanggil kaedah asli yang diisytiharkan dengan kata kunci
native
. - JVM memuatkan perpustakaan yang dikongsi (
.dll
pada Windows,.so
on linux,.dylib
on macOS). - Kod asli melaksanakan kaedah tersebut , biasanya dalam C/C.
- Data ditukar antara Java dan jenis asli menggunakan fungsi JNI.
- Secara pilihan, kod asli boleh memanggil kembali ke kaedah Java .
?? Gunakan JNI dengan berhati -hati - ia memintas ciri keselamatan JVM seperti pengumpulan sampah dan pemeriksaan keselamatan.
![]()
? Contoh langkah demi langkah: Memanggil C dari Java
Kami akan membuat program mudah di mana Java memanggil fungsi C yang mengembalikan rentetan.
1. Tulis kelas Java
// helloworld.java kelas awam Helloworld { // mengisytiharkan kaedah asli rentetan asli awam berkataHello (); // memuatkan perpustakaan asli statik { System.LoadLibrary ("Hello"); // beban libhello.so (linux), hello.dll (windows), atau libhello.dylib (macOS) } public static void main (string [] args) { HelloWorld HW = new HelloWorld (); System.out.println (hw.sayhello ()); } }
Menyusunnya:
Javac Helloworld.java
Ini menghasilkan HelloWorld.class
.
2. Menjana fail header menggunakan javah
(ditutup) atau javac -h
Sejak JDK 8, javah
ditahan. Gunakan:
Javac -H. Helloworld.java
Ini menghasilkan fail header: HelloWorld.h
, yang kelihatan seperti:
/ * Jangan edit fail ini - ia adalah mesin yang dihasilkan */ #include <jni.h> / * Header untuk kelas helloworld */ #ifndef _included_helloworld #define _included_helloworld #ifdef __cplusplus Extern "C" { #endif /* * Kelas: Helloworld * Kaedah: Sayhello * Tandatangan: () ljava/lang/string; */ Jniexport jstring jnicall java_helloworld_sayhello (Jnienv *, pekerjaan); #ifdef __cplusplus } #endif #endif
Catatan:
-
Java_HelloWorld_sayHello
adalah konvensyen penamaan yang diperlukan. -
JNIEnv*
adalah penunjuk antara muka untuk mengakses fungsi JNI. -
jobject
merujuk kepada contoh objekHelloWorld
.
3. Melaksanakan kaedah asli dalam c
Buat HelloWorld.c
:
#include <jni.h> #termasuk "helloworld.h" #include <string.h> Jniexport jstring jnicall java_helloworld_sayhello (Jnienv *env, pekerjaan obj) { kembali (*env)-> newstringutf (env, "hello dari c melalui jni!"); }
Di sini:
- Kami menggunakan
(*env)->NewStringUTF()
untuk menukar rentetan c (char*
) kejstring
. - Semua fungsi JNI diakses melalui penunjuk
JNIEnv
.
4. Menyusun kod C ke dalam perpustakaan bersama
Pada Linux/MacOS:
gcc -fpic -i "$ {java_home}/termasuk" -i "$ {java_home}/termasuk/linux" \ -Shared -o libhello.so helloworld.c
Ganti
/linux
dengan/darwin
pada macOS.
Pada Windows (menggunakan Mingw atau MSVC):
gcc -i "%java_home%\ include" -i "%java_home%\ include \ win32" -shared -o hello.dll helloworld.c
Pastikan output sepadan dengan System.loadLibrary()
yang diharapkan:
- Linux:
libhello.so
- Windows:
hello.dll
- MacOS:
libhello.dylib
5. Jalankan program
Pastikan Perpustakaan Dikongsi berada di Laluan Perpustakaan:
java -djava.library.path =. Helloworld
Output:
Helo dari C melalui JNI!
? Kejayaan! Java memanggil fungsi C anda.
? Lulus dan mengembalikan jenis data
JNI menyokong pelbagai penukaran jenis data.
Jenis Java | Jenis asli (c/c) | JNI typedef |
---|---|---|
Boolean | char unsigned | Jboolean |
byte | ditandatangani char | Jbyte |
int | int | jint |
panjang | panjang lama | jlong |
ganda | ganda | JDouble |
Rentetan | char* (diubahsuai UTF-8) | jstring |
Objek [] | JobjectArray | pelbagai rujukan |
Contoh: Tambahkan dua bilangan bulat dalam c
Java:
kelas awam Mathlib { Int Native Int ADM (int a, int b); statik { System.LoadLibrary ("matematik"); } public static void main (string [] args) { Mathlib Ml = baru Mathlib (); System.out.println ("5 7 =" ml.add (5, 7)); } }
C Pelaksanaan ( MathLib.c
):
#include <jni.h> #termasuk "mathlib.h" Jniexport jint jnicall java_mathlib_add (Jnienv *env, Job Obj, Jint A, Jint B) { kembali AB; }
Langkah penyusunan yang sama dikenakan.
? Mengakses bidang dan kaedah Java dari kod asli
Kod asli juga boleh memanggil kembali ke Java .
Contoh: Panggil kaedah Java dari C.
Java:
callbackexample kelas awam { nilai int swasta = 42; public void printValue () { System.out.println ("Nilai dari Java:" Nilai); } public native void callprintValue (); statik { System.LoadLibrary ("Callback"); } public static void main (string [] args) { callBackExample baru (). CallPrintValue (); } }
Pelaksanaan C:
#include <jni.h> #termasuk "callbackexample.h" Jniexport void jnicall java_callbackexample_callprintValue (Jnienv *env, pekerjaan obj) { // Dapatkan kelas JClass cls = (*env)-> getObjectClass (env, obj); // Cari id kaedah jMethodid mid = (*env)-> getMethodid (env, cls, "printValue", "() v"); jika (pertengahan == null) kembali; // Kaedah tidak dijumpai // panggil kaedah java (*env)-> callVoidMethod (env, obj, mid); }
Tandatangan "()V"
bermaksud: tiada hujah, mengembalikan kekosongan.
Kembali semula dan jalankan → output:
Nilai dari Java: 42
Anda baru sahaja membuat C memanggil kaedah Java!
?? Perangkap biasa & amalan terbaik
- Konvensyen Penamaan : Nama kaedah asli mesti mengikuti
Java_PackageName_ClassName_MethodName
. - Pengendalian Pengecualian : Sentiasa periksa pengecualian selepas panggilan JNI kritikal menggunakan
(*env)->ExceptionCheck()
atauExceptionOccurred()
. - Pengurusan memori : Rujukan tempatan yang dibuat dalam kod asli dibersihkan secara automatik kecuali disematkan. Elakkan kebocoran ingatan.
- Keselamatan Thread :
JNIEnv
adalah benang-tempatan. Jangan kongsi di seluruh benang. - Prestasi : Menyeberangi sempadan JNI mempunyai overhead. Meminimumkan panggilan kerap.
- Kemudahalihan : Perpustakaan asli adalah OS/Khusus Senibina. Anda mungkin memerlukan pelbagai binaan.
? Bilakah anda harus menggunakan JNI?
Gunakan JNI bila:
- Interfacing dengan perkakasan atau OS API (misalnya, pemandu peranti).
- Menggunakan semula warisan C/C Legacy.
- Bahagian prestasi kritikal (contohnya, matematik, pemprosesan imej).
- Mengintegrasikan dengan perpustakaan asli (OpenCV, OpenSSL, dan lain -lain).
Elakkan JNI bila:
- Penyelesaian Java Pure wujud.
- Kemudahalihan adalah kunci.
- Kesederhanaan dan penyelenggaraan lebih penting daripada kelajuan.
Ringkasan
JNI membolehkan integrasi yang kuat antara Java dan kod asli. Dengan hanya beberapa langkah - mengisytiharkan kaedah native
, menjana tajuk, menulis kod C, menyusun kepada perpustakaan yang dikongsi, dan memuatkannya - anda boleh melanjutkan keupayaan Java di luar JVM.
Ia bukan sesuatu yang anda gunakan setiap hari, tetapi apabila anda memerlukannya, ia sangat diperlukan.
Pada asasnya, JNI membuka pintu - hanya berhati -hati dengan apa yang anda bawa.
Atas ialah kandungan terperinci Interface Native Java (JNI) dijelaskan dengan contoh. 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.

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.

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

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

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

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.
