Programavimas

„Java“ patarimas 23: Parašykite vietinius metodus

Gebėjimas parašyti tik vieną kodo rinkinį „Java“ ir leisti jį paleisti kiekvienoje sistemoje naudojant „Java“ vykdymo laiką yra viena iš pagrindinių „Java“ stipriųjų pusių. Tačiau ši platformos nepriklausomybė turi vieną pagrindinį trūkumą: ką mes darome su didžiuliu esamų kodų kiekiu? Apgaulė yra naudoti vadinamąjį vietinio metodo sąsaja.

Rašant vietinius metodus reikia importuoti C kodą į „Java“ programą. Šiame patarime paaiškinsiu pagrindinį savųjų metodų kūrimo ir jų naudojimo „Java“ programoje receptą.

Septyni natūralaus metodo „nirvana“ žingsniai yra šie:

  • Parašykite Java kodą
  • Sudarykite Java kodą
  • Sukurti C antraštę (.h failas)
  • Sukurkite C stubai failą
  • Parašykite C kodą
  • Sukurti bendrinamą kodų biblioteką (arba DLL)
  • Paleisti programą

Mūsų pratimas yra parašyti šiek tiek teksto į konsolę iš vidinio metodo. Šio pavyzdžio ypatumai bus nukreipti į „Unix“ tipo sistemą, ypač „Linux“. Aš atkreipsiu dėmesį į keletą vietų, kuriose išsiskiria kitos platformos.

Parašykite Java kodą

Parašykite savo „Java“ kodą taip, kaip paprastai. Norėdami „Java“ kode naudoti vietinius metodus, turite atlikti du veiksmus. Pirmiausia parašykite kiekvieno norimo naudoti savojo metodo deklaraciją. Tai lygiai taip pat, kaip parašyti įprastos „Java“ metodo sąsajos deklaraciją, tačiau turite nurodyti gimtoji raktinis žodis:

public native void printText (); 

Antrasis lankas, per kurį reikia pereiti, turite aiškiai įkelti gimtojo kodo biblioteką. (Sukursime tai vėliau.) Tai darome įkeldami biblioteką į klasės statinį bloką:

statinis {System.loadLibrary ("laimingas"); } 

Norėdami sujungti šias dalis mūsų pavyzdyje, sukurkite failą, pavadintą Laiminga.java turinį:

klasė Happy {public native void printText (); statinis {System.loadLibrary ("laimingas"); / * Atkreipkite dėmesį į klasės vardo mažąsias raides! * /} public static void main (String [] argumentuoja) {Happy happy = new Happy (); laimingas.printText (); }} 

Sudarykite „Java“ kodą

Sudarykite Laiminga.java failas:

% javac Happy.java 

Sukurkite C antraštės failą

Yra įvairių stebuklingų užkalbėjimų, kurie turi būti prieinami, kad mūsų C kodas būtų naudojamas kaip vietinis metodas. javah Java kompiliatoriaus funkcionalumas generuos reikalingas deklaracijas ir panašias iš mūsų Laimingas klasė. Tai sukurs Laimingas.h failą, kurį turėtume įtraukti į savo C kodą:

% javah Laimingas 

Sukurkite C stuburo failą

Taip, kad „C ++“ vertėjai elgiasi su C ++ metodų pavadinimais, „Java“ kompiliatorius turi panašią beprotybę. Kad sumažintų skausmą, kai reikia rašyti daug varginančio kodo, kad mūsų C kodą būtų galima iškviesti iš „Java“ vykdymo laiko sistemos, „Java“ kompiliatorius gali automatiškai sugeneruoti mums būtiną batuto kodą:

% javah -stubs Happy 

Parašykite C kodą

Dabar parašykime tikrąjį kodą, kad atsispausdintume mūsų sveikinimą. Pagal susitarimą mes įdėjome šį kodą į failą, pavadintą mūsų „Java“ klasės vardu, prie kurio pridėta eilutė „Imp“. Tai lemia HappyImp.c. Įdėkite šiuos daiktus į HappyImp.c:

#include & ltStubPreamble.h> / * Standartinis savojo metodo dalykas. * / #įtraukti „Happy.h“ / * Sukurta anksčiau. * / #include & ltstdio.h> / * Standartiniai C IO dalykai. * / void Happy_printText (struct HHappy * this) {kelia ("Su Naujaisiais Metais !!!"); } 

Susiejant savo C kodą su „Java“, yra įtraukta daugybė kitų aspektų, pavyzdžiui, kaip perduoti ir grąžinti begales tipų. Norėdami gauti daugiau informacijos, žr. „Java“ mokymo programą arba „Hermetica Native Methods Paper“ (URL ieškokite skyriuje „Ištekliai“).

Sukurkite bendrą biblioteką

Šis skyrius labiausiai priklauso nuo sistemos. Panašu, kad kiekviena platforma ir kiekvienas kompiliatoriaus / susiejimo derinys turi skirtingą metodą kuriant ir naudojant bendras bibliotekas. Žmonėms, naudojantiems bet kurią iš įvairių „Microsoft Windows“ platformų, patikrinkite C kompiliatoriaus dokumentaciją, ar nėra smulkmenos.

Jums, „Linux“ žmonėms, štai kaip sukurti bendrą biblioteką naudojant GCC. Pirmiausia surinkite jau sukurtus C šaltinio failus. Jūs turite pasakyti kompiliatoriui, kur rasti „Java“ gimtojo metodo palaikymo failus, tačiau pagrindinis triukas yra tas, kad jūs turite aiškiai pasakyti kompiliatoriui, kad jis sukurtų Psvyravimas n nepriklausomas Codė:

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

Dabar sukurkite bendrinamą biblioteką iš gautų objektų (.o) failų su tokiu stebuklingu užkeikimu:

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

Nukopijuokite bendrinamos bibliotekos failą į standartinį trumpąjį pavadinimą:

% cp libhappy.so.1.0 libhappy.so 

Galiausiai jums gali tekti pasakyti savo dinaminiam susiejėjui, kur rasti šį naują bendrinamos bibliotekos failą. Naudojant bash apvalkalas:

% eksporto LD_LIBRARY_PATH = "pwd": $ LD_LIBRARY_PATH 

Vykdykite programą

Paleiskite „Java“ programą kaip įprasta:

% java Laiminga 

Na, tai viskas. Ačiū Tony'ui Deringui, kuris perdavė „Linux“ būdingus užkalbėjimus.

Greita dizaino pastaba

Prieš skubėdamas rašyti vietinius viso to seno kodo metodus, perspėčiau visus mus atidžiai pažvelgti į esamas sistemas ir sužinoti, ar yra geresnių būdų jas prijungti prie „Java“. Pavyzdžiui, yra „Java Database Connectivity“ (JDBC) ir dar aukštesnio lygio sprendimai, kaip pasiekti „Java“ duomenų bazes. Taigi, pažvelkite į visas savo krepšio gudrybes ir naudokite tai, kas prasminga projektui.

Sužinokite daugiau apie šią temą

  • „JavaSoft“ savojo metodo mokomoji medžiaga //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
  • „Hermetica Native Methods Paper“ //www.hermetica.com/technologia/java/native/

Šią istoriją „Java Patarimas 23: Rašykite vietinius metodus“ iš pradžių paskelbė „JavaWorld“.

$config[zx-auto] not found$config[zx-overlay] not found