Mahdollisuus kirjoittaa vain yksi koodisarja Java-käyttöjärjestelmään ja saada se toimimaan jokaisessa järjestelmässä Java-ajoajalla on yksi Javan ensisijaisista vahvuuksista. Mutta tällä alustan riippumattomuudella on yksi keskeinen haittapuoli: Mitä teemme valtavan määrän olemassa olevalla koodilla? Temppu on käyttää ns natiivimenetelmän käyttöliittymä.
Natiivien menetelmien kirjoittaminen edellyttää C-koodin tuomista Java-sovellukseesi. Tässä vinkissä opastan sinut perusreseptin alkuperäisten menetelmien luomiseen ja niiden käyttämiseen Java-sovelluksessa.
Seitsemän vaihetta natiivimenetelmän nirvaanaan Natiivimenetelmien luomisen vaiheet ovat seuraavat:
- Kirjoita Java-koodi
- Käännä Java-koodi
- Luo C-otsikko (.h tiedosto)
- Luo C tynkä tiedosto
- Kirjoita C-koodi
- Luo jaettu koodikirjasto (tai DLL)
- Suorita sovellus
Harjoituksemme on kirjoittaa tekstiä konsolille alkuperäisen menetelmän sisältä. Tämän esimerkin yksityiskohdat suunnataan Unix-tyyppiseen järjestelmään, erityisesti Linuxiin. Esitän muutaman paikan, joissa yksityiskohdat eroavat toisissa alustoissa.
Kirjoita Java-koodi
Kirjoita Java-koodisi tavalliseen tapaan. Jos haluat käyttää alkuperäisiä menetelmiä Java-koodissasi, sinun on tehtävä kaksi asiaa. Kirjoita ensin natiivimenetelmäseloste jokaiselle natiivimenetelmälle, jota haluat käyttää. Tämä on kuin tavallisen Java-menetelmärajapinnan julistuksen kirjoittaminen, mutta sinun on määritettävä syntyperäinen avainsana seuraavasti:
public native void printText ();
Toinen kehä, jonka läpi voit hypätä, on, että sinun on nimenomaisesti ladattava natiivikoodikirjasto. (Luomme tämän myöhemmin.) Teemme tämän lataamalla kirjaston luokan staattiseen lohkoon:
staattinen {System.loadLibrary ("onnellinen"); }
Jos haluat yhdistää nämä kappaleet esimerkkiä varten, luo tiedosto nimeltä Hyvää. Java
seuraavalla sisällöllä:
luokka Happy {public native void printText (); staattinen {System.loadLibrary ("onnellinen"); / * Huomaa pienet luokanimet! * /} public staattinen void main (String [] argumentti) {Happy happy = new Happy (); happy.printText (); }}
Käännä Java-koodi
Kokoa Hyvää. Java
tiedosto:
% javac Happy.java
Luo C-otsikkotiedosto
On olemassa erilaisia taikuuden loitsuja, jotka on asetettava saataville, jotta C-koodia voidaan käyttää alkuperäisenä menetelmänä. javah
Java-kääntäjän toiminnallisuus luo tarvittavat ilmoitukset ja vastaavat Onnellinen
luokassa. Tämä luo Hyvää. H
tiedosto, jonka voimme sisällyttää C-koodiin:
% javah Hyvää
Luo C-kannan tiedosto
Java-kääntäjällä on samanlainen hulluus tavallaan, kun C ++-kääntäjät tekevät C ++ -menetelmien nimiin sekaantumisen. Helpottaakseen kipua siitä, että meidän on kirjoitettava paljon tylsiä koodeja, jotta C-koodiamme voidaan käyttää Java-ajonaikaisesta järjestelmästä, Java-kääntäjä voi luoda tarvittavan trampoliinikoodin automaattisesti meille:
% javah -tyylit onnellinen
Kirjoita C-koodi
Nyt kirjoitetaan todellinen koodi tulostaa tervehdyksemme. Sopimuksen mukaan laitamme tämän koodin tiedostoon, joka on nimetty Java-luokan mukaan ja johon on lisätty merkkijono "Imp". Tämä johtaa HappyImp.c
. Aseta seuraava astiaan HappyImp.c
:
#include & ltStubPreamble.h> / * Tavallinen natiivimenetelmäinen juttu. * / # sisältää "Happy.h" / * Luotu aiemmin. * / # sisältää & ltstdio.h> / * Standardi C IO -tuotteet. * / void Happy_printText (struct HHappy * this) {laittaa ("Hyvää uutta vuotta !!!"); }
C-koodin ja Java: n liittämisessä on mukana monia muita näkökohtia - kuten kuinka lukemattomat tyypit välitetään ja palautetaan. Lisätietoja on Java-opetusohjelmassa tai Hermetica Native Methods Paperissa (katso URL-osoitteet Resurssit-osiosta).
Luo jaettu kirjasto
Tämä osa on järjestelmästä riippuvin. Näyttää siltä, että jokaisella alustalla ja jokaisella kääntäjä / linkkeri-yhdistelmällä on erilainen tapa luoda jaettuja kirjastoja. Jos sinulla on jotain Microsoft Windows -alustaa, tarkista C-kääntäjän dokumentaatiosta tarkat yksityiskohdat.
Linux-ihmisille, miten voit luoda jaetun kirjaston GCC: n avulla. Koosta ensin luomamme C-lähdetiedostot. Sinun on kerrottava kääntäjälle, mistä löydät Java-natiivimenetelmän tukitiedostot, mutta tärkein temppu tässä on, että sinun on kerrottava kääntäjä nimenomaisesti tuottamaan Posiointi Minäriippumaton Coodi:
% gcc -I / usr / local / java / include -I / usr / local / java / include / genunix -fPIC -c Happy.c HappyImp.c
Luo nyt jaettu kirjasto tuloksena olevista objekti (.o) tiedostoista seuraavalla maagisella loitsulla:
% gcc -jaettu -Wl, -nimi, libhappy.so.1 -o libhappy.so.1.0 onnellinen.o HappyImp.o
Kopioi jaettu kirjastotiedosto tavalliselle lyhyelle nimelle:
% cp libhappy.so.1.0 libhappy.so
Lopuksi, sinun on ehkä kerrottava dynaamiselle linkittimellesi, mistä tämä uusi jaettu kirjastotiedosto löytyy. Käyttämällä lyödä kuori:
% viennin LD_LIBRARY_PATH = "pwd": $ LD_LIBRARY_PATH
Suorita sovellus
Suorita Java-sovellus tavalliseen tapaan:
% java onnellinen
No, siinä kaikki siinä on. Kiitos Tony Deringille Linux-kohtaisten loitsujen välittämisestä.
Nopea suunnitteluhuomautus
Ennen kuin kiirehdin kirjoittamaan natiivimenetelmiä koko vanhalle koodille, varoitan meitä kaikkia tarkastelemaan huolellisesti olemassa olevia järjestelmiä ja selvittämään, onko olemassa parempia tapoja liittää ne Java-järjestelmään. Esimerkiksi Java Database Connectivity (JDBC) ja jopa korkeamman tason ratkaisut tietokantojen käyttämiseen Java-ohjelmasta. Joten, katso kaikki laukussa olevat temput ja käytä sitä, mikä on järkevää käsillä olevalle projektille.
Lisätietoja tästä aiheesta
- JavaSoft Native Method Tuturial //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
- Hermetica Native Methods Paper //www.hermetica.com/technologia/java/native/
Tämän tarinan "Java Tip 23: Write native methods" julkaisi alun perin JavaWorld.