Java-Tipp 23: Schreiben Sie native Methoden

Die Fähigkeit, nur einen Satz Code in Java zu schreiben und auf jedem System mit einer Java-Laufzeit ausführen zu lassen, ist eine der Hauptstärken von Java. Diese Plattformunabhängigkeit hat jedoch einen entscheidenden Nachteil: Was machen wir mit der großen Menge an vorhandenem Code? Der Trick besteht darin, die sogenannte native Methodenschnittstelle zu verwenden .

Beim Schreiben nativer Methoden wird C-Code in Ihre Java-Anwendung importiert. In diesem Tipp werde ich Sie durch das Grundrezept zum Erstellen nativer Methoden und deren Verwendung in einer Java-Anwendung führen.

Sieben Schritte zum Nirvana der nativen Methode Die Schritte zum Erstellen nativer Methoden lauten wie folgt:

  • Schreiben Sie Java-Code
  • Kompilieren Sie Java-Code
  • C-Header erstellen ( .h- Datei)
  • Erstellen Sie eine C- Stubs- Datei
  • Schreiben Sie C-Code
  • Erstellen Sie eine gemeinsam genutzte Codebibliothek (oder DLL).
  • Führen Sie die Anwendung aus

Unsere Übung besteht darin, innerhalb der nativen Methode Text in die Konsole zu schreiben. Die Besonderheiten dieses Beispiels richten sich an ein Unix-ähnliches System, insbesondere Linux. Ich werde auf einige Stellen hinweisen, an denen sich die Details für andere Plattformen unterscheiden.

Schreiben Sie Java-Code

Schreiben Sie Ihren Java-Code wie gewohnt. Um native Methoden in Ihrem Java-Code zu verwenden, müssen Sie zwei Dinge tun. Schreiben Sie zunächst eine native Methodendeklaration für jede native Methode, die Sie verwenden möchten. Dies entspricht dem Schreiben der Deklaration einer normalen Java-Methodenschnittstelle, Sie müssen jedoch das native Schlüsselwort wie folgt angeben :

public native void printText (); 

Der zweite Rahmen, durch den Sie springen müssen, ist, dass Sie die native Codebibliothek explizit laden müssen. (Wir werden dies später erstellen.) Dazu laden wir die Bibliothek in einen statischen Klassenblock:

statisch {System.loadLibrary ("happy"); }}

Um diese Teile für unser Beispiel zusammenzustellen, erstellen Sie eine Datei Happy.javamit dem folgenden Inhalt:

Klasse Happy {public native void printText (); static {System.loadLibrary ("happy"); / * Kleinbuchstaben des Klassennamens beachten! * /} public static void main (String [] args) {Happy happy = new Happy (); happy.printText (); }}

Kompilieren Sie Java-Code

Kompilieren Sie die Happy.javaDatei:

% javac Happy.java 

Erstellen Sie eine C-Header-Datei

Es gibt verschiedene magische Beschwörungsformeln, die verfügbar gemacht werden müssen, damit unser C-Code als native Methode verwendet werden kann. Die javahFunktionalität des Java-Compilers generiert die erforderlichen Deklarationen und dergleichen aus unserer HappyKlasse. Dadurch wird eine Happy.hDatei erstellt, die wir in unseren C-Code aufnehmen können:

% javah Glücklich 

Erstellen Sie eine C-Stubs-Datei

In einer Art und Weise, die an die Verwirrung erinnert, die C ++ - Übersetzer mit den Namen von C ++ - Methoden anstellen, hat der Java-Compiler einen ähnlichen Wahnsinn. Um den Aufwand zu verringern, viel langwierigen Code schreiben zu müssen, damit unser C-Code vom Java-Laufzeitsystem aufgerufen werden kann, kann der Java-Compiler den erforderlichen Trampolincode automatisch für uns generieren:

% javah -stubs Glücklich 

Schreiben Sie C-Code

Schreiben wir nun den eigentlichen Code, um unsere Begrüßung auszudrucken. Konventionell fügen wir diesen Code in eine Datei ein, die nach unserer Java-Klasse benannt ist und an die die Zeichenfolge "Imp" angehängt ist. Dies führt zu HappyImp.c. Legen Sie Folgendes in HappyImp.c:

#include & ltStubPreamble.h> / * Standardmaterial für native Methoden. * / #include "Happy.h" / * Früher generiert. * / #include & ltstdio.h> / * Standard C IO Zeug. * / void Happy_printText (struct HHappy * this) {setzt ("Frohes Neues Jahr !!!"); }}

Bei der Anbindung Ihres C-Codes an Java spielen viele andere Aspekte eine Rolle - beispielsweise das Übergeben und Zurückgeben der unzähligen Typen. Weitere Informationen finden Sie im Java-Lernprogramm oder im Hermetica Native Methods Paper (URLs finden Sie im Abschnitt Ressourcen).

Erstellen Sie eine gemeinsam genutzte Bibliothek

Dieser Abschnitt ist am systemabhängigsten. Es scheint, dass jede Plattform und jede Compiler / Linker-Kombination eine andere Methode zum Erstellen und Verwenden von gemeinsam genutzten Bibliotheken hat. Informationen zu Benutzern, die eine der verschiedenen Microsoft Windows-Plattformen verwenden, finden Sie in der Dokumentation Ihres C-Compilers.

Für Linux-Benutzer erfahren Sie hier, wie Sie mit GCC eine gemeinsam genutzte Bibliothek erstellen. Kompilieren Sie zunächst die C-Quelldateien, die wir bereits erstellt haben. Sie haben den Compiler zu sagen , wo die Java native Methode Support - Dateien zu finden, aber der wichtigste Trick hier ist , dass man sich ausdrücklich Compiler sagen müssen produzieren P osition I ndependent C ode :

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

Erstellen Sie nun eine gemeinsam genutzte Bibliothek aus den resultierenden Objektdateien (.o) mit der folgenden magischen Beschwörung:

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

Kopieren Sie die gemeinsam genutzte Bibliotheksdatei in den Standardkurznamen:

% cp libhappy.so.1.0 libhappy.so 

Schließlich müssen Sie Ihrem dynamischen Linker möglicherweise mitteilen, wo sich diese neue gemeinsam genutzte Bibliotheksdatei befindet. Verwenden der Bash- Shell:

% export LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Führen Sie die Anwendung aus

Führen Sie die Java-Anwendung wie folgt aus:

% java Glücklich 

Nun, das ist alles was dazu gehört. Vielen Dank an Tony Dering für die Weitergabe der Linux-spezifischen Beschwörungsformeln.

Eine kurze Designnotiz

Bevor wir uns beeilen, native Methoden für den gesamten Legacy-Code zu schreiben, möchte ich uns alle warnen, die vorhandenen Systeme sorgfältig zu prüfen und zu prüfen, ob es bessere Möglichkeiten gibt, sie mit Java zu verbinden. Beispielsweise gibt es Java Database Connectivity (JDBC) und sogar übergeordnete Lösungen für den Zugriff auf Datenbanken von Java aus. Schauen Sie sich also alle Tricks in Ihrer Tasche an und verwenden Sie, was für das jeweilige Projekt sinnvoll ist.

Erfahren Sie mehr über dieses Thema

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

Diese Geschichte "Java-Tipp 23: Native Methoden schreiben" wurde ursprünglich von JavaWorld veröffentlicht.