Petua Java 23: Tulis kaedah asli

Kemampuan untuk menulis hanya satu set kode di Java dan menjalankannya di setiap sistem dengan jangka waktu Java adalah salah satu kekuatan utama Java. Tetapi kebebasan platform ini mempunyai satu kelemahan utama: Apa yang kita lakukan dengan sebilangan besar kod yang ada? Caranya adalah dengan menggunakan antara muka kaedah asli yang disebut .

Menulis kaedah asli melibatkan mengimport kod C ke dalam aplikasi Java anda. Dalam petua ini saya akan membimbing anda melalui resipi asas untuk membuat kaedah asli dan menggunakannya dalam aplikasi Java.

Tujuh langkah untuk kaedah asli nirvana Langkah-langkah untuk mewujudkan kaedah asli adalah seperti berikut:

  • Tulis kod Java
  • Menyusun kod Java
  • Buat header C ( fail .h )
  • Buat fail stubs C
  • Tulis kod C
  • Buat pustaka kod bersama (atau DLL)
  • Jalankan aplikasi

Latihan kami adalah menulis beberapa teks ke konsol dari dalam kaedah asli. Spesifikasi contoh ini akan diarahkan pada sistem seperti Unix, khususnya Linux. Saya akan menunjukkan beberapa titik di mana perinciannya berbeza untuk platform lain.

Tulis kod Java

Tuliskan kod Java anda seperti biasa. Untuk menggunakan kaedah asli dalam kod Java anda, anda mesti melakukan dua perkara. Pertama, tulis deklarasi kaedah asli untuk setiap kaedah asli yang anda mahu gunakan. Ini sama seperti menulis deklarasi antara muka kaedah Java biasa, tetapi anda mesti menentukan kata kunci asli , seperti berikut:

printText void asli awam (); 

Gelung kedua yang harus dilalui ialah anda mesti memuatkan pustaka kod asli secara eksplisit. (Kami akan membuatnya kemudian.) Kami melakukannya dengan memuatkan perpustakaan di blok statik kelas:

statik {System.loadLibrary ("gembira"); }

Untuk menyusun kepingan ini sebagai contoh kami, buat fail yang dipanggil Happy.javadengan kandungan berikut:

kelas Selamat {public void printText (); statik {System.loadLibrary ("gembira"); / * Perhatikan huruf kecil nama kelas! * /} umum kekosongan statik awam (String [] args) {Happy happy = new Happy (); gembira.printText (); }}

Menyusun kod Java

Susun Happy.javafail:

% javac Happy.java 

Buat fail tajuk C

Terdapat pelbagai mantera sihir yang mesti disediakan supaya kod C kami dapat digunakan sebagai kaedah asli. Yang javahfungsi pengkompil Java akan menjana pengisytiharan perlu dan apa-apa dari kami Happykelas. Ini akan membuat Happy.hfail untuk kami masukkan dalam kod C kami:

% javah Selamat 

Buat fail stubs C

Dengan cara yang mengingatkan pada mangling yang dilakukan oleh penterjemah C ++ dengan nama kaedah C ++, penyusun Java mempunyai kegilaan yang serupa. Untuk meringankan keperitan kerana perlu menulis banyak kod yang membosankan sehingga kod C kami dapat dipanggil dari sistem jangka masa Java, penyusun Java dapat menghasilkan kod trampolin yang diperlukan secara automatik untuk kami:

% javah -stubs Selamat 

Tulis kod C

Sekarang, mari tulis kod sebenar untuk mencetak ucapan kami. Secara konvensional, kami meletakkan kod ini dalam sebuah file yang dinamai kelas Java kami dengan rentetan "Imp" ditambahkan padanya. Ini menghasilkan HappyImp.c. Letakkan perkara berikut ke dalam HappyImp.c:

#include & ltStubPreamble.h> / * Perkara kaedah asli standard. * / #sertakan "Happy.h" / * Dihasilkan lebih awal. * / #include & ltstdio.h> / * Barang standard I I. * / batal Happy_printText (struct HHappy * ini) {meletakkan ("Selamat Tahun Baru !!!"); }

Dalam menghubungkan kod C anda dengan Java, banyak aspek lain yang terlibat - seperti cara melewati dan mengembalikan pelbagai jenis. Untuk maklumat lebih lanjut, lihat tutorial Java atau Kertas Kaedah Asli Hermetica (lihat bahagian Sumber untuk URL).

Buat pustaka bersama

Bahagian ini adalah yang paling bergantung pada sistem. Sepertinya setiap platform dan setiap gabungan penyusun / penghubung mempunyai kaedah yang berbeza untuk membuat dan menggunakan perpustakaan bersama. Untuk orang yang menggunakan salah satu daripada pelbagai platform Microsoft Windows, periksa dokumentasi untuk penyusun C anda untuk maklumat terperinci.

Bagi anda Linux, berikut adalah cara membuat perpustakaan bersama menggunakan GCC. Pertama, susun fail sumber C yang telah kita buat. Anda perlu memberitahu pengkompil di mana untuk mencari Java fail sokongan kaedah asli, tetapi helah utama di sini adalah bahawa anda perlu jelas memberitahu pengkompil untuk menghasilkan P osition Saya ndependent C syair pujian :

% gcc -I / usr / local / java / include -I / usr / local / java / include / genunix -fPIC -c Happy.c HappyImp.c 

Sekarang, buat pustaka bersama dari fail objek (.o) yang dihasilkan dengan mantera ajaib berikut:

% gcc -shared -Wl, -soname, libhappy.so.1 -o libhappy.so.1.0 Happy.o HappyImp.o 

Salin fail pustaka bersama ke nama pendek standard:

% cp libhappy.so.1.0 libhappy.so 

Akhirnya, anda mungkin perlu memberitahu pemaut dinamik anda di mana untuk mencari fail pustaka kongsi baru ini. Menggunakan shell bash :

% eksport LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Jalankan aplikasi

Jalankan aplikasi Java seperti biasa:

% java Selamat 

Itu sahaja yang ada. Terima kasih kepada Tony Dering kerana menyampaikan mantera khusus Linux.

Nota reka bentuk ringkas

Sebelum bergegas menulis kaedah asli untuk semua kod warisan itu, saya mengingatkan kita semua untuk melihat dengan teliti sistem yang ada dan melihat apakah ada cara yang lebih baik untuk menghubungkannya ke Java. Sebagai contoh, ada Java Database Connectivity (JDBC) dan bahkan penyelesaian peringkat lebih tinggi untuk mengakses pangkalan data dari Java. Oleh itu, perhatikan semua helah dalam beg anda dan gunakan apa yang masuk akal untuk projek yang sedang dijalankan.

Ketahui lebih lanjut mengenai topik ini

  • Tutorial Kaedah Asli JavaSoft //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
  • Kertas Kaedah Asli Hermetica //www.hermetica.com/technologia/java/native/

Kisah ini, "Petua Java 23: Menulis kaedah asli" pada awalnya diterbitkan oleh JavaWorld.