Rumah  >  Artikel  >  Java  >  Cara menggunakan pengubah suai asli di Java

Cara menggunakan pengubah suai asli di Java

王林
王林ke hadapan
2023-04-22 15:46:081838semak imbas

Penggunaan pengubah asli

asli digunakan terutamanya untuk kaedah

1. Kaedah asli ialah antara muka untuk Java untuk memanggil kod bukan Java. Kaedah asli bermaksud pelaksanaan kaedah tersebut dilaksanakan dalam bahasa bukan Jawa, seperti C atau C++.

2. Apabila mentakrifkan kaedah asli, badan pelaksanaan tidak disediakan (lebih seperti mentakrifkan Antara Muka Java), kerana badan pelaksanaannya dilaksanakan secara luaran oleh bahasa bukan Jawa.

Penjelasan

Bahasa Java itu sendiri tidak boleh mengakses dan mengendalikan lapisan bawah sistem pengendalian, tetapi ia boleh memanggil bahasa lain melalui antara muka JNI untuk mencapai akses ke lapisan bawah.

JNI ialah Java Native Interface, antara muka pengaturcaraan asli, yang merupakan sebahagian daripada Java Software Development Kit (SDK). JNI membenarkan kod Java menggunakan kod dan perpustakaan kod yang ditulis dalam bahasa lain.

API Invocation (sebahagian daripada JNI) boleh digunakan untuk membenamkan Mesin Maya Java (JVM) ke dalam aplikasi asli, membenarkan pengaturcara memanggil kod Java dari dalam kod asli.

Contoh

Dalam kod sumber JDK, ambil system.class sebagai contoh Memandangkan kaedah yang berkaitan sistem pengendalian dipanggil, dan operasi tidak dilaksanakan dalam Java, akan ada banyak pengubahsuaian asli.

Cara menggunakan pengubah suai asli di Java

Apakah kegunaan kaedah ubah suai Asli

Saya secara tidak sengaja melihat kod itu hari ini dan mendapati bahawa orang lain mempunyai kaedah bertulis? seperti ini, dan terdapat beberapa dll dalam balang Fail itu agak pelik, jadi saya membuka kod dan menemui kaedah penulisan berikut.

public native String GSMModemSMSReadAll(String s, int i);
public native String GSMModemGetErrorMsg(String s);
public native boolean GSMModemIsConn(String s);

Saya rasa ia agak menarik, saya mencari maklumat di Internet dan mendapati ia bagus. Kaedah lain menggunakan java untuk memanggil bahasa lain (saya tidak tahu sebelum ini -_#)

Saya menghabiskan dua jam hari ini untuk membaca artikel bahasa Inggeris tentang apa itu Kaedah Asli Berdasarkan pemahaman teks asal.

Apakah Kaedah Asli

Ringkasnya, Kaedah Asli ialah antara muka untuk java memanggil kod bukan java. Kaedah Asli ialah kaedah Java yang pelaksanaannya dilaksanakan dalam bahasa bukan Jawa, seperti C. Ciri ini bukan unik untuk Java Banyak bahasa pengaturcaraan lain mempunyai mekanisme ini Sebagai contoh, dalam C++, anda boleh menggunakan "C" luaran untuk memberitahu pengkompil C++ untuk memanggil fungsi C.

"Kaedah asli ialah kaedah Java yang pelaksanaannya disediakan oleh kod bukan java."

Apabila mentakrifkan kaedah asli, badan pelaksanaan tidak disediakan ( Ada yang suka mentakrifkan antara muka java), kerana pelaksanaannya dilaksanakan secara luaran oleh bahasa bukan java. , contoh diberikan di bawah:

   public class IHaveNatives
    {undefined
      native public void Native1( int x ) ;
      native static public long Native2() ;
      native synchronized private float Native3( Object o ) ;
      native void Native4( int[] ary ) throws Exception ;
    }

Pengisytiharan kaedah ini menerangkan rupa beberapa kod bukan java dalam kod java ini (pandangan).

Pengecam asli boleh digunakan dengan semua pengecam java lain, kecuali abstrak. Ini adalah munasabah, kerana asli membayangkan bahawa kaedah ini mempunyai pelaksanaan, tetapi pelaksanaan ini bukan Java, tetapi abstrak jelas menunjukkan bahawa kaedah ini tidak mempunyai pelaksanaan. Apabila asli digunakan dengan pengecam Java yang lain, maknanya tidak berbeza dengan Kaedah bukan Asli Sebagai contoh, statik asli menunjukkan bahawa kaedah ini boleh dipanggil secara langsung tanpa menghasilkan contoh kelas. Ini sangat mudah, contohnya, apabila anda mahu menggunakan kaedah asli untuk memanggilnya pustaka kelas A. Kaedah ketiga di atas menggunakan disegerakkan asli. JVM akan melaksanakan mekanisme kunci penyegerakan sebelum memasuki pelaksanaan kaedah ini (sama seperti berbilang benang Java.)

Kaedah asli boleh mengembalikan sebarang jenis java. jenis asas, dan juga boleh dikawal oleh pengecualian. Pelaksanaan kaedah ini boleh mencipta pengecualian dan membuangnya, yang hampir sama dengan kaedah Java. Apabila kaedah asli menerima beberapa jenis bukan asas seperti Objek atau tatasusunan integer, kaedah tersebut boleh mengakses dalaman jenis bukan asas ini, tetapi ini akan menjadikan kaedah asli bergantung pada pelaksanaan kelas Java yang anda akses. Satu perkara yang perlu diingat ialah kita boleh mengakses semua ciri Java dalam pelaksanaan asli kaedah asli, tetapi ini bergantung pada pelaksanaan ciri Java yang anda akses, dan berbuat demikian adalah jauh lebih rendah daripada menggunakan ciri tersebut dalam bahasa Java. Ciri-ciri adalah mudah dan mudah.

Kewujudan kaedah asli tidak akan memberi kesan kepada kelas lain yang memanggil kaedah asli ini. Malah, kelas lain yang memanggil kaedah ini tidak tahu bahawa mereka memanggil kaedah asli. JVM akan mengawal semua butiran memanggil kaedah asli. Kita perlu memberi perhatian kepada situasi apabila kita mengisytiharkan kaedah tempatan sebagai muktamad. Badan kaedah yang dilaksanakan di Jawa mungkin mengalami peningkatan kecekapan disebabkan oleh sebaris apabila ia disusun. Walau bagaimanapun, adalah dipersoalkan sama ada kaedah akhir asli juga boleh mendapatkan faedah sedemikian, tetapi ini hanya isu pengoptimuman kod dan tidak mempunyai kesan ke atas pelaksanaan fungsi.

Jika kelas yang mengandungi kaedah tempatan diwarisi, subkelas akan mewarisi kaedah tempatan dan boleh mengatasi kaedah ini dalam bahasa Java (ini kelihatan agak pelik), sama jika kaedah tempatan ditandakan dengan fianl , ia tidak boleh ditimpa selepas diwarisi.

Kaedah tempatan sangat berguna kerana ia memanjangkan jvm dengan berkesan Malah, kod java yang kami tulis telah pun menggunakan kaedah tempatan Dalam pelaksanaan mekanisme java concurrency (multi-threading), kebanyakannya berkaitan dengan. Semua titik sentuh menggunakan kaedah asli, yang membolehkan program Java melangkaui sempadan masa jalan Java. Dengan kaedah asli, program Java boleh melakukan sebarang tugas peringkat aplikasi.

Mengapa menggunakan Kaedah Asli

Java sangat mudah digunakan, tetapi beberapa tahap tugas tidak mudah untuk dilaksanakan dengan java, atau apabila kita sangat mengambil berat tentang kecekapan program, masalah timbul.

Interaksi di luar persekitaran java: Kadangkala aplikasi java perlu berinteraksi dengan persekitaran di luar java. Inilah sebab utama mengapa kaedah tempatan wujud Anda boleh memikirkan situasi apabila Java perlu bertukar maklumat dengan beberapa sistem asas seperti sistem pengendalian atau beberapa perkakasan. Kaedah tempatan adalah mekanisme komunikasi sedemikian: ia menyediakan antara muka yang sangat mudah, dan kami tidak perlu memahami butiran rumit di luar aplikasi Java.

Interaksi dengan sistem pengendalian: JVM menyokong bahasa Java itu sendiri dan pustaka masa jalan Ia adalah platform yang bergantung kepada program Java yang terdiri daripada penterjemah (mentafsir bytecode) dan Terdiri daripada perpustakaan yang menyambung kepada kod asli. Bagaimanapun, ia bukan sistem yang lengkap, ia sering bergantung pada sokongan beberapa sistem asas (di bawah). Sistem asas ini selalunya merupakan sistem pengendalian yang berkuasa. Dengan menggunakan kaedah asli, kita boleh menggunakan Java untuk merealisasikan interaksi antara jre dan sistem asas Malah beberapa bahagian JVM ditulis dalam C. Selain itu, jika kita ingin menggunakan beberapa ciri sistem pengendalian yang dilakukan oleh bahasa Java itu sendiri. tidak menyediakan enkapsulasi, kami juga perlu menggunakan kaedah asli.

Sun's Java: Sun's penterjemah dilaksanakan dalam C, yang menjadikannya berinteraksi dengan luar seperti C biasa. Kebanyakan jre dilaksanakan di java, dan ia juga berinteraksi dengan dunia luar melalui beberapa kaedah tempatan. Sebagai contoh: kaedah setPriority() kelas java.lang.Thread dilaksanakan dalam java, tetapi ia memanggil kaedah tempatan setPriority0() dalam kelas. Kaedah asli ini dilaksanakan dalam C dan ditanam di dalam JVM Pada platform Windows 95, kaedah asli ini akhirnya akan memanggil Win32 SetPriority() API. Ini adalah pelaksanaan khusus kaedah tempatan yang disediakan secara langsung oleh JVM Lebih kerap, kaedah tempatan disediakan oleh perpustakaan pautan dinamik luaran (perpustakaan pautan dinamik luaran) dan kemudian dipanggil oleh JVM.

Bagaimanakah JVM membuat Kaedah Asli dijalankan?

Kami tahu bahawa apabila kelas digunakan buat kali pertama, kod bait kelas ini akan dimuatkan ke dalam memori dan hanya akan dimuatkan semula sekali . Senarai semua deskriptor kaedah kelas dikekalkan di pintu masuk kod bait yang dimuatkan ini mengandungi maklumat sedemikian: tempat kod kaedah disimpan, parameter apa yang ada padanya dan deskriptor kaedah (kategori awam) dan sebagainya pada.

Jika deskriptor kaedah mengandungi asli, blok deskriptor ini akan mempunyai penunjuk kepada pelaksanaan kaedah tersebut. Pelaksanaan ini terdapat dalam beberapa fail DLL, tetapi ia akan dimuatkan ke dalam ruang alamat program Java oleh sistem pengendalian. Apabila kelas dengan kaedah asli dimuatkan, DLL yang berkaitan tidak dimuatkan, jadi penunjuk kepada pelaksanaan kaedah tidak ditetapkan. DLL ini tidak akan dimuatkan sehingga kaedah asli dipanggil, yang dicapai dengan memanggil java.system.loadLibrary().

Perkara terakhir yang perlu diambil perhatian ialah terdapat overhead dalam menggunakan kaedah asli, dan ia kehilangan banyak faedah java. Jika kita tiada pilihan, kita boleh memilih untuk menggunakan kaedah tempatan

Atas ialah kandungan terperinci Cara menggunakan pengubah suai asli di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam