Ohjelmointi

Java-vinkki 23: Kirjoita alkuperäisiä menetelmiä

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.