Programmering

Java Tips 23: Skriv innfødte metoder

Evnen til å skrive bare ett sett med kode i Java og få den kjørt på hvert system med en Java-kjøretid er en av Java's viktigste styrker. Men denne plattformuavhengigheten har en viktig ulempe: Hva gjør vi med den enorme mengden eksisterende kode? Trikset er å bruke den såkalte native metoden grensesnitt.

Å skrive innfødte metoder innebærer å importere C-kode til Java-applikasjonen. I dette tipset vil jeg gå gjennom den grunnleggende oppskriften for å lage innfødte metoder og bruke dem i et Java-program.

Syv trinn til innfødt metode nirvana Trinnene for å opprette innfødte metoder er som følger:

  • Skriv Java-kode
  • Kompilere Java-kode
  • Opprett C-topptekst (.h fil)
  • Opprett C stubber fil
  • Skriv C-kode
  • Opprett delt kodebibliotek (eller DLL)
  • Kjør applikasjon

Vår øvelse er å skrive litt tekst til konsollen fra den opprinnelige metoden. Spesifikasjonene i dette eksemplet vil være rettet mot et Unix-lignende system, spesielt Linux. Jeg vil påpeke et par steder hvor detaljene er forskjellige for andre plattformer.

Skriv Java-kode

Skriv Java-koden slik du vanligvis gjør. For å bruke native metoder i Java-koden din, må du gjøre to ting. Først skriver du en erklæring om innfødte metoder for hver innfødte metode du vil bruke. Dette er akkurat som å skrive erklæringen om et vanlig Java-metodegrensesnitt, men du må spesifisere innfødt nøkkelord, som følger:

offentlig innfødt ugyldig printText (); 

Den andre bøylen du skal hoppe gjennom er at du eksplisitt må laste det opprinnelige kodebiblioteket. (Vi lager dette senere.) Vi gjør dette ved å laste biblioteket i en klassisk statisk blokk:

statisk {System.loadLibrary ("lykkelig"); } 

For å sette disse brikkene sammen for vårt eksempel, opprett en fil som heter Happy.java med følgende innhold:

klasse Happy {public native void printText (); statisk {System.loadLibrary ("lykkelig"); / * Merk små bokstaver av klassenavn! * /} offentlig statisk ugyldig hoved (String [] args) {Happy happy = new Happy (); happy.printText (); }} 

Kompilere Java-kode

Kompilere Happy.java fil:

% javac Happy.java 

Opprett en C-headerfil

Det er forskjellige magiske besvergelser som må gjøres tilgjengelige slik at C-koden vår kan brukes som en naturlig metode. De javah funksjonaliteten til Java-kompilatoren vil generere de nødvendige erklæringer og slikt fra vår Lykkelig klasse. Dette vil skape en Happy.h fil for oss å inkludere i C-koden vår:

% javah Happy 

Lag en C stubs-fil

På en måte som minner om manglingen som C ++ -oversetterne gjør med navnene på C ++ -metoder, har Java-kompilatoren en lignende galskap. For å lette smerten ved å måtte skrive mye kjedelig kode slik at C-koden vår kan påkalles fra Java kjøretidssystem, kan Java-kompilatoren generere den nødvendige trampolinkoden automatisk for oss:

% javah -stubs Happy 

Skriv C-kode

La oss nå skrive den faktiske koden for å skrive ut hilsenen. Etter konvensjon la vi denne koden i en fil oppkalt etter Java-klassen vår med strengen "Imp" vedlagt. Dette resulterer i HappyImp.c. Plasser følgende i HappyImp.c:

#include & ltStubPreamble.h> / * Standard innfødte metoden ting. * / # inkluderer "Happy.h" / * Generert tidligere. * / #include & ltstdio.h> / * Standard C IO-ting. * / ugyldig Happy_printText (struct HHappy * dette) {putter ("Godt nytt år !!!"); } 

Når du grensesnitt C-koden din med Java, er mange andre aspekter involvert - for eksempel hvordan du sender og returnerer de utallige typene. For mer informasjon, se Java-opplæringen eller Hermetica Native Methods Paper (se Ressurser-delen for URL-adresser).

Lag et delt bibliotek

Denne delen er den mest avhengige av systemet. Det virker som om hver plattform og hver kompilator / koblingskombinasjon har en annen metode for å opprette og bruke delte biblioteker. For folk som bruker noen av de forskjellige Microsoft Windows-plattformene, kan du sjekke dokumentasjonen for C-kompilatoren din for detaljer.

For deg Linux-folk, her er hvordan du oppretter et delt bibliotek ved hjelp av GCC. Først må du kompilere C-kildefilene som vi allerede har opprettet. Du må fortelle kompilatoren hvor du kan finne Java-innfødte metodes støttefiler, men hovedtrikset her er at du eksplisitt må fortelle kompilatoren å produsere Posisjon Jeguavhengig Code:

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

Opprett nå et delt bibliotek av de resulterende objektfilene (.o) med følgende magiske besvergelse:

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

Kopier den delte biblioteksfilen til standard kortnavn:

% cp libhappy.so.1.0 libhappy.so 

Til slutt må du kanskje fortelle din dynamiske linker hvor du finner denne nye delte biblioteksfilen. Bruker bash skall:

% eksport LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Utfør søknaden

Kjør Java-applikasjonen som vanlig:

% java Happy 

Vel, det er alt det er med det. Takk til Tony Dering for videreføring av Linux-spesifikke besvergelser.

Et raskt designnotat

Før jeg skynder meg for å skrive innfødte metoder for all den eldre koden, vil jeg advare oss alle til å se nøye på de eksisterende systemene og se om det er bedre måter å koble dem til Java. For eksempel er det Java Database Connectivity (JDBC) og enda høyere nivåløsninger for tilgang til databaser fra Java. Så, se på alle triksene i vesken din og bruk det som er fornuftig for prosjektet.

Lær mer om dette emnet

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

Denne historien, "Java Tips 23: Skriv innfødte metoder" ble opprinnelig utgitt av JavaWorld.

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