Programmering

Java Tip 23: Skriv native metoder

Evnen til kun at skrive et sæt kode i Java og få det til at køre på hvert system med en Java-kørselstid er en af ​​Java's primære styrker. Men denne platforms uafhængighed har en vigtig ulempe: Hvad gør vi med den store mængde eksisterende kode? Tricket er at bruge den såkaldte native metode interface.

Skrivning af indfødte metoder indebærer import af C-kode til din Java-applikation. I dette tip leder jeg dig gennem den grundlæggende opskrift til oprettelse af native metoder og brug af dem i en Java-applikation.

Syv trin til native-metode nirvana Trinene til oprettelse af native-metoder er som følger:

  • Skriv Java-kode
  • Kompilér Java-kode
  • Opret C-overskrift (.h fil)
  • Opret C stubbe fil
  • Skriv C-kode
  • Opret delt kodebibliotek (eller DLL)
  • Kør applikation

Vores øvelse er at skrive noget tekst til konsollen indefra den oprindelige metode. Specifikationerne i dette eksempel vil være rettet mod et Unix-lignende system, specifikt Linux. Jeg vil påpege et par pletter, hvor detaljerne adskiller sig fra andre platforme.

Skriv Java-kode

Skriv din Java-kode, som du normalt ville. For at bruge native metoder i din Java-kode skal du gøre to ting. Skriv først en erklæring om native-metoden for hver native-metode, du vil bruge. Dette er ligesom at skrive erklæringen om en normal Java-metodegrænseflade, men du skal angive hjemmehørende nøgleord som følger:

public native void printText (); 

Den anden ramme, du skal springe igennem, er at du eksplicit skal indlæse det oprindelige kodebibliotek. (Vi opretter dette senere.) Vi gør dette ved at indlæse biblioteket i en klassisk statisk blok:

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

For at sætte disse stykker sammen til vores eksempel skal du oprette en fil kaldet Happy.java med følgende indhold:

klasse Happy {public native void printText (); statisk {System.loadLibrary ("glad"); / * Bemærk små bogstaver i klassenavn! * /} offentlig statisk ugyldig hoved (String [] args) {Happy happy = new Happy (); happy.printText (); }} 

Kompilér Java-kode

Kompilér Happy.java fil:

% javac Happy.java 

Opret en C-header-fil

Der er forskellige magiske besværgelser, der skal gøres tilgængelige, så vores C-kode kan bruges som en indfødt metode. Det javah Java-kompilatorens funktionalitet genererer de nødvendige erklæringer og lignende fra vores Lykkelig klasse. Dette vil skabe en Happy.h fil, som vi skal medtage i vores C-kode:

% javah Happy 

Opret en C-stubs-fil

På en måde der minder om manglen, som C ++ -oversættere gør med navnene på C ++ -metoder, har Java-kompilatoren en lignende galskab. For at lette smerten ved at skulle skrive en masse kedelig kode, så vores C-kode kan påberåbes fra Java-kørselstidssystemet, kan Java-kompilatoren generere den nødvendige trampolinkode automatisk for os:

% javah -stubs Happy 

Skriv C-kode

Lad os nu skrive den faktiske kode for at udskrive vores hilsen. Efter konvention anbragte vi denne kode i en fil opkaldt efter vores Java-klasse med strengen "Imp" vedhæftet den. Dette resulterer i HappyImp.c. Placer følgende i HappyImp.c:

#include & ltStubPreamble.h> / * Standard indfødte metode ting. * / #include "Happy.h" / * Genereret tidligere. * / #include & ltstdio.h> / * Standard C IO-ting. * / ugyldigt Happy_printText (struktur HHappy * dette) {sætter ("Godt nytår !!!"); } 

I grænsefladen mellem din C-kode og Java er mange andre aspekter involveret - såsom hvordan man sender og returnerer de utallige typer. For mere information se Java-tutorial eller Hermetica Native Methods Paper (se afsnittet Ressourcer for URL'er).

Opret et delt bibliotek

Dette afsnit er det mest systemafhængige. Det ser ud til, at enhver platform og hver kompilator / linkerkombination har en anden metode til at oprette og bruge delte biblioteker. For folk, der bruger en af ​​de forskellige Microsoft Windows-platforme, skal du kontrollere dokumentationen til din C-compiler for de detaljerede detaljer.

For dig Linux-folk, her er hvordan du opretter et delt bibliotek ved hjælp af GCC. Først skal du kompilere de C-kildefiler, som vi allerede har oprettet. Du er nødt til at fortælle compileren, hvor du kan finde Java-native-supportfiler, men det vigtigste trick her er, at du eksplicit skal fortælle compileren at producere Position jeguafhængig Code:

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

Opret nu et delt bibliotek ud af de resulterende objekt (.o) filer med følgende magiske besværgelse:

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

Kopier den delte biblioteksfil til det korte standardnavn:

% cp libhappy.so.1.0 libhappy.so 

Endelig skal du muligvis fortælle din dynamiske linker, hvor du finder denne nye delte biblioteksfil. Bruger bash skal:

% eksport LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Udfør applikationen

Kør Java-applikationen som normalt:

% java Happy 

Nå, det er alt der er ved det. Tak til Tony Dering for at viderebringe de Linux-specifikke besværgelser.

En hurtig designnote

Før jeg skynder mig for at skrive indfødte metoder til al den ældre kode, vil jeg advare os alle om at se nøje på de eksisterende systemer og se, om der er bedre måder at forbinde dem til Java. For eksempel er der Java Database Connectivity (JDBC) og endda højere niveau løsninger til adgang til databaser fra Java. Så se på alle de tricks i din taske, og brug det, der giver mening for det aktuelle projekt.

Lær mere om dette emne

  • 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 historie, "Java Tip 23: Skriv native metoder" blev oprindeligt udgivet af JavaWorld.