2. Hello World!

zurück zurück weiter weiter
 

2.1 Beispiel

Als Einführung in das Thema JNI soll die "Hello World!" Anwenendung dienen. Die Quellen des Beispieles und eine übersetzte Version kann hier heruntergeladen werden [kap02.zip]. Eine allgemeine Anleitung zu den Beispielen ist im Anhang zu finden.

Beispiel:

> java HelloWorld

Ausgabe:

HelloWorld!

Das kleine Programm ist eine Java-Anwendung mit nativen Methoden. Der Aufruf java HelloWorld zeigt daß es keinen äußeren Unterschied zu einer gewöhnlichen Java-Anwendung gibt. Der Aufruf des Interpreters ist gleich. Der Dialog in dem Beispiel wird durch die Windows Funktion MessageBox erzeugt. Diese wird durch die native Java Methode show der Klasse HelloWorld.java aufgerufen.

 

2.2 Quellcode

Java Code:

	public class HelloWorld {
	
	  public native void show();
	
	  public static void main(String[] args) {
	    System.loadLibrary("HelloWorld");

	    HelloWorld hw = new HelloWorld();
	    hw.show();
	  }
	
	}
C Code:

	#include <stdio.h>
	#include <windows.h>
	
	#include "classes\Generated Source\HelloWorld.h"
	
	JNIEXPORT void JNICALL
	Java_HelloWorld_show(JNIEnv *env, jobject thisObj) {
		
		int me; // MessageBox Rückgabewert
		
		// MessageBox anzeigen
		me = MessageBox(NULL,"Hello World!","Hello World!",MB_OKCANCEL);
	
		// Ausgabe
		if( me == IDOK )
			printf("*** OK ***");
		else
			printf("*** CANCEL ***");
	
	}
In der Java Klasse HelloWorld ist die native Methode show deklariert. Die deklaration hat Ähnlichkeit mit der einer abstrakten Methode. Der Unterschied liegt nur in dem midifier native. In der main Methode wird mit dem Aufruf System.loadLibrary("HelloWorld") eine Bibliothek geladen in der sich die Implementierung der Methode show befindet. Unter Windows ist das eine .dll und unter Linux eine .so Datei. Unter den verschiedenen UNIX und Linux Versionen kann unter Umständen noch der Kürzel lib vor den Bibliotheknamen angehägt werden. So muß die Bibliothek unter Solaris zum Beispiel libHelloWorld.so heißen.

Der C Code enthält die Funktion die bei dem Aufruf der Java Methode show aufgerufen wird. In den C Code wird die Header Datei HelloWorld.h eingebunden. Diese wird aus der Java Klasse mit dem Programm javah automatisch generiert. Die generierte Header Datei enthält die C Deklaration der nativen Funktion. Der Funktionsname hat einen speziellen Aufbau damit die Zuordnung der Java Methode zu der nativen Funktion von der API vorgenommen werden kann. Die Header Datei darf nicht geändert werden. Zusätzlich zu den Parametern der Methoden werden an eine native Funktion immer die beiden zusätzlichen Parameter JNIEnv *env und jobject thisObj übergeben. env ist ein Zeiger auf die Umgebung in der das Objekt "lebt", thisObj ist eine Referenz des eigentlichen Objektes.

 

2.3 Entwicklung einer JNI Anwendung

Die prinzipielle Vorgehensweise bei der Entwicklung einer JNI Anwendung umfasst sieben Schritte. Die folgende Grafik zeigt die Vorgehensweise:

Die Schritte im einzelnen:

  1. Java Quellcode entwickeln
  2. Mit javac eine .class Datei erzeugen
  3. Mit javah aus der .class Datei die Header Datei generieren
  4. C/C++ Code entwickeln
  5. Übersetzen der C/C++ Quellen zu einer Objekt Datei
  6. Dynamische Bibliothek erzeugen
  7. Mit java die in I. erzeugte .class Datei starten

Die Schritte I. bis III. können bequem mit einer Entwicklungsumgebung in einem Schritt abgearbeitet werden. Bei der Entwicklungsumgebung JBuilder 4 kann die Generierung der C/C++-Header Dateien per Option eingestellt werden. Der JBuilder generiert bei jdem Compilerlauf die gewünschten Header Dateien dann neu.

Genau so können die Schritte IV bis VI mit einer geeigneten Entwicklungsumgebung abgearbeitet werden. Unter Windows kann das Visual Studio der Firma Microsoft dazu verwendet. Das Visual Studio unterstützt den Entwickler dabei mit geeigneten Wizards zu Erstellung von dynamischen Bibliotheen und nimmt die Grundeinstellungen für den Compiler und Linker vor.

 
zurück zurück weiter weiter
© 2001, Michael Bromm Version 1.0