Java savjet 23: Napišite izvorne metode

Sposobnost pisanja samo jednog skupa koda na Javi i njegovo pokretanje na svakom sustavu s Java radnim vremenom jedna je od glavnih Java prednosti. No, ova neovisnost o platformi ima jedan ključni nedostatak: što ćemo učiniti s ogromnom količinom postojećeg koda? Trik je u korištenju takozvanog sučelja izvorne metode .

Pisanje izvornih metoda uključuje uvoz C koda u vaš Java program. U ovom savjetu provest ću vas kroz osnovni recept za stvaranje izvornih metoda i njihovu upotrebu u Java aplikaciji.

Sedam koraka do nativne metode nirvane Koraci do stvaranja nativnih metoda su sljedeći:

  • Napišite Java kod
  • Sastavite Java kôd
  • Izradite zaglavlje C ( .h datoteka)
  • Stvorite datoteku C stubs
  • Napišite C kod
  • Stvori biblioteku zajedničkih kodova (ili DLL)
  • Pokrenite aplikaciju

Naša vježba je da napišemo tekst na konzolu iz matične metode. Specifičnosti ovog primjera bit će usmjerene prema sustavu sličnom Unixu, točnije Linuxu. Istaknut ću nekoliko mjesta na kojima se detalji razlikuju za ostale platforme.

Napišite Java kod

Napišite svoj Java kôd kao i obično. Da biste koristili izvorne metode u svom Java kodu, morate učiniti dvije stvari. Prvo napišite deklaraciju nativne metode za svaku nativnu metodu koju želite koristiti. To je baš poput pisanja deklaracije uobičajenog sučelja Java metode, ali morate navesti matičnu ključnu riječ, kako slijedi:

javni izvorni void printText (); 

Drugi obruč kroz koji trebate preskočiti jest da morate izričito učitati matičnu knjižnicu koda. (To ćemo stvoriti kasnije.) To radimo učitavanjem knjižnice u statički blok klase:

static {System.loadLibrary ("sretan"); }

Da biste sastavili ove dijelove za naš primjer, stvorite datoteku koja se zove Happy.javasa sljedećim sadržajem:

klasa Happy {public native void printText (); static {System.loadLibrary ("sretan"); / * Obratite pažnju na mala slova naziva klase! * /} javna statička void glavna (String [] args) {Happy happy = novo Happy (); happy.printText (); }}

Sastavite Java kôd

Sastavite Happy.javadatoteku:

% javac Happy.java 

Stvorite datoteku zaglavlja C.

Postoje razni čarobni uroci koji moraju biti dostupni kako bi se naš C kôd mogao koristiti kao izvorna metoda. javahFunkcionalnost Java prevodilac će generirati potrebne izjave i kao iz naše Happyklase. Ovo će stvoriti Happy.hdatoteku koju ćemo uključiti u naš C kod:

% javah Sretan 

Stvorite datoteku C stubs

Na način koji podsjeća na mangiranje koje prevoditelji C ++ rade s imenima C ++ metoda, Java prevodilac ima slično ludilo. Kako bi ublažio bol zbog pisanja puno zamornog koda kako bi se naš C kôd mogao pozvati iz Java-run-time sustava, Java kompajler može automatski generirati potrebni kôd trampolina za nas:

% javah -stubs Sretan 

Napišite C kod

Sada, napišimo stvarni kod za ispis našeg pozdrava. Prema dogovoru, ovaj smo kôd stavili u datoteku nazvanu po našoj Java klasi s nizom "Imp" koji mu je dodan. To rezultira HappyImp.c. Stavite sljedeće u HappyImp.c:

#include & ltStubPreamble.h> / * Standardne nativne metode. * / #include "Happy.h" / * Generirano ranije. * / #include & ltstdio.h> / * Standardne C IO stvari. * / void Happy_printText (struct HHappy * this) {put ("Sretna Nova godina !!!"); }

U povezivanju vašeg C koda s Javom uključeni su mnogi drugi aspekti - poput načina prosljeđivanja i vraćanja bezbrojnih vrsta. Za više informacija pogledajte Java tutorial ili Hermetica Native Methods Paper (pogledajte odjeljak Resursi za URL-ove).

Stvorite zajedničku knjižnicu

Ovaj odjeljak najviše ovisi o sustavu. Čini se da svaka platforma i svaka kombinacija prevoditelja / povezivača imaju drugačiji način stvaranja i korištenja zajedničkih knjižnica. Za ljude koji koriste bilo koju od različitih platformi Microsoft Windows, potražite detaljne detalje u dokumentaciji za vaš C kompajler.

Za vas Linux, evo kako stvoriti zajedničku biblioteku pomoću GCC-a. Prvo kompajlirajte izvorne datoteke C koje smo već stvorili. Moraš reći prevodilac gdje pronaći Java izvorni metoda datoteke podrške, ali glavni trik je u tome da morate izričito reći prevodilac za proizvodnju P ozicija I ndependent C odu :

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

Sada iz rezultirajućih datoteka objekta. (O) stvorite zajedničku knjižnicu sa sljedećim čarobnim urokom:

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

Kopirajte datoteku zajedničke knjižnice u standardni kratki naziv:

% cp libhappy.so.1.0 libhappy.so 

Napokon, možda ćete trebati reći svom dinamičkom povezivaču gdje pronaći ovu novu datoteku zajedničke knjižnice. Korištenje bash ljuske:

% izvoz LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Izvršite aplikaciju

Pokrenite Java aplikaciju kao i obično:

% java Sretna 

Pa, to je sve. Zahvaljujemo Tonyju Deringu na prenošenju specifičnih za Linux.

Kratka napomena o dizajnu

Prije nego što požurim s pisanjem izvornih metoda za sav taj naslijeđeni kôd, upozorio bih sve da pažljivo pogledamo postojeće sustave i vidimo postoje li bolji načini za njihovo povezivanje s Javom. Na primjer, postoje Java Database Connectivity (JDBC) i čak rješenja na višoj razini za pristup bazama podataka s Jave. Dakle, pogledajte sve trikove u svojoj torbi i upotrijebite ono što ima smisla za projekt koji je u tijeku.

Saznajte više o ovoj temi

  • JavaSoft Native Method Tuturial //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
  • Hermetica Native Methods Paper //www.hermetica.com/technologia/java/native/

Ovu priču, "Java tip 23: Napišite nativne metode" izvorno je objavio JavaWorld.