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.