1. Apa metode asli
Sederhananya, metode asli adalah antarmuka di mana Java memanggil kode non-java. Metode asli adalah metode Java: implementasi metode ini diimplementasikan oleh bahasa non-java, seperti C. Fitur ini tidak unik untuk Java. Banyak bahasa pemrograman lainnya memiliki mekanisme ini. Misalnya, dalam C ++, Anda dapat menggunakan Extern "C" untuk memberi tahu kompiler C ++ untuk memanggil fungsi C.
"Metode asli adalah metode Java yang implementasinya disediakan oleh kode non-java."
Saat mendefinisikan metode asli, badan implementasi tidak disediakan (beberapa seperti mendefinisikan antarmuka Java), karena badan implementasinya diimplementasikan di luar oleh bahasa non-java. , Inilah contohnya:
paket java.lang; objek kelas publik {...... Kelas Asli Akhir Publik <?> GetClass (); hashcode int asli int (); Clone objek asli yang dilindungi () melempar clonenotsupportedException; public final native void notify (); public final void notifyall (); Wait Void Native Final Public (Timeout Long) melempar interruptedException; ......}Identifier asli dapat digunakan dengan semua pengidentifikasi Java lainnya, kecuali abstrak. Ini masuk akal karena asli menyiratkan bahwa metode ini memiliki badan implementasi, tetapi badan implementasi ini adalah non-java, tetapi abstrak jelas menunjukkan bahwa metode ini tidak memiliki badan implementasi. Ketika pengidentifikasi Java asli dan lainnya digunakan, maknanya tidak berbeda dengan metode non-asli.
Metode metode asli dapat mengembalikan jenis Java apa pun, termasuk tipe non-primitif, dan juga dapat melakukan kontrol pengecualian. Implementasi metode ini dapat membuat pengecualian dan melemparkannya, yang sangat mirip dengan metode Java.
Keberadaan metode asli tidak memiliki efek pada kelas lain yang menyebut metode lokal ini. Bahkan, kelas lain yang menyebut metode ini bahkan tidak tahu bahwa itu memanggil metode lokal. JVM akan mengontrol semua detail panggilan metode lokal.
Jika kelas yang berisi metode lokal diwarisi, subkelas akan mewarisi metode lokal dan dapat menulis ulang metode dalam java (ini tampaknya agak aneh). Demikian pula, jika metode lokal diidentifikasi oleh fianl, itu tidak dapat ditulis ulang setelah diwariskan.
Metode lokal sangat berguna karena mereka secara efektif memperluas JVM. Bahkan, kode Java yang kami tulis telah menggunakan metode lokal. Dalam implementasi mekanisme Sun's Java Concurrency (multi-threading), banyak titik kontak dengan sistem operasi menggunakan metode lokal, yang memungkinkan program Java melampaui batas runtime Java. Dengan metode lokal, program Java dapat melakukan tugas tingkat aplikasi.
2. Cara menggunakan
Kata kunci asli menunjukkan bahwa metode modifikasi adalah metode asli. Implementasi metode yang sesuai tidak ada dalam file saat ini, tetapi dalam file yang diimplementasikan dalam bahasa lain (seperti C dan C ++). Bahasa Java itu sendiri tidak dapat mengakses dan mengoperasikan lapisan yang mendasari sistem operasi, tetapi dapat menggunakan antarmuka JNI untuk memanggil bahasa lain untuk mencapai akses ke lapisan yang mendasarinya.
JNI adalah antarmuka asli Java, antarmuka pemrograman asli, yang merupakan bagian dari Java Software Development Kit (SDK). JNI memungkinkan kode Java untuk menggunakan basis kode dan kode yang ditulis dalam bahasa lain. API Doa (bagian dari JNI) dapat digunakan untuk menyematkan Java Virtual Machines (JVM) ke dalam aplikasi asli, yang memungkinkan pemrogram untuk memanggil kode Java dari dalam kode asli.
Namun, panggilan ke Java eksternal biasanya tidak dapat diangkut ke platform lain, dan pengecualian keamanan juga dapat dinaikkan dalam applet. Menerapkan Kode Asli akan mencegah aplikasi Java Anda melewati 100% pengujian Java murni. Namun, jika panggilan lokal harus dilakukan, ada beberapa pedoman yang perlu dipertimbangkan:
1. Merangkum semua metode lokal Anda ke dalam kelas yang memanggil DLL tunggal. Untuk setiap platform sistem operasi target, versi DLL khusus untuk platform yang sesuai dapat digunakan. Ini meminimalkan dampak kode lokal dan membantu memperhitungkan masalah porting yang diperlukan nanti.
2. Metode lokal sesederhana mungkin. Cobalah untuk meminimalkan ketergantungan metode lokal Anda pada runtime DLL pihak ketiga (termasuk Microsoft). Jadikan metode lokal Anda sebaik mungkin untuk meminimalkan overhead yang diperlukan untuk memuat DLL dan aplikasi Anda. Jika diperlukan runtime DLL, itu harus disediakan dengan aplikasi.
Langkah -langkah penulisan JNI adalah sebagai berikut:
Berikut adalah contoh sederhana memanggil program C lokal di Java:
A. Tulis kelas HelloWorld.java
class helloWorld {public asli void hello (); static {system.loadLibrary ("hello");} public static void main (string [] args) {new helloWorld (). hello ();}}B. Terjemahan
javac helloworld.java
C. Menghasilkan file .h
javah -jni helloworld
Konten yang dihasilkan adalah sebagai berikut:
/* Jangan mengedit file ini - mesin ini dihasilkan*/#sertakan <jni.h>/* header untuk kelas HelloWorld*/#ifndef _included_helloworld#define _includeded_helloworld#ifdef __cplusplusExtern "c" Jnicall java_helloworld_hello (jnienv *, jobject);#ifdef __cplusplus}#endif#endif
Parameter pertama adalah penunjuk lingkungan JNI yang digunakan saat memanggil metode JNI. Parameter kedua adalah pegangan ke objek Java HelloWorld instantiated dalam kode Java ini. Parameter lain adalah parameter dari metode itu sendiri
Implementasi DC
#include <jni.h> #include "helloWorld.h" #include <stdio.h> jniexport void jnicall java_helloworld_hello (jnienv *env, jobject obj) {printf ("hello world!/n"); return;}Di antara mereka, baris pertama adalah memperkenalkan file JNI.H (dalam direktori %java_home/termasuk), yang berisi definisi JNIenV dan Jobject.
e. Kompilasi implementasi C.
Di sini, mengambil Windows sebagai contoh, Anda perlu menghasilkan file DLL. Di bawah folder Simpan HelloWorldImpl.c, gunakan kompiler VC untuk membuatnya.
cl -i%java_home%/termasuk -i%java_home%/include/win32 -ld helloworldimp.c -fehello.dll
Catatan: Nama file DLL yang dihasilkan dikonfigurasi setelah opsi -fe, berikut adalah halo, karena nama yang kami gunakan saat LoadLibary di file helloworld.java adalah halo. Tentu saja, setelah modifikasi di sini, itu juga perlu dimodifikasi di sana. Selain itu, -i%java_home%/termasuk -i%java_home%/include/win32 parameter perlu ditambahkan, karena file JNI.H diperkenalkan saat menulis metode lokal pada langkah keempat.
F. Jalankan program
Java HelloWorld baik -baik saja!
Di atas adalah pengantar rinci untuk kata kunci asli di Java, dan saya harap ini akan membantu untuk pembelajaran semua orang.