3. Zugriff auf Variablen

zurück zurück weiter weiter
 

3.1 Zugriff auf Objekt Variablen

JNI bietet die Möglichkeit auf Objekt Variablen lesend oder schreibend zuzugreifen. Die Beispiele zum Thema können hier vollständig heruntergeladen werden [kap03.zip]. Der folgende C Code zeigt einen schreibenden Zugriff auf zwei Objekt Variablen der Klasse SettingVariables. Der Zugriff erfolgt durch die native Methode update dieser Klasse.

Die Objekt Variablen in Java sind wie folgt definiert:

	...
	public long _long = 1;
	private int _int = 2;
	...
			
C Code:
	JNIEXPORT void JNICALL
	Java_SettingVariables_update(JNIEnv *env, jobject thisObj) {
		jclass clazz;
		jfieldID fid_long;
		jfieldID fid_int;
		jint ji = 100;
	
		clazz = (*env)->GetObjectClass(env, thisObj);
	
		fid_long = (*env)->GetFieldID(env, clazz, "_long", "J");
		fid_int = (*env)->GetFieldID(env, clazz, "_int", "I");
		
		(*env)->SetLongField(env, thisObj, fid_long, ji++);
		(*env)->SetIntField(env, thisObj, fid_int, ji++);
		...
			
Zuerst muß über die Umgebung des Objektes und das Objekt selbst ein Verweis auf die Klasse des Objektes geholt werden. Diese geschieht mitteles der übergebenen Parameter env und thisObj. Die JNI Funktion GetObjectClass liefert die Klasse des Objektes. Danach muß ein Verweis auf die Variable, auf die zugegriffen werden soll geholt werden. Dazu wird die Funktion GetFieldID verwendet. Die Funktion erwartet als Parameter die Umgebung, die Klasse, den Namen der Variable und eine Signatur der Variable. Die Signaturen werden später noch genauer beschrieben. Im dritten Schritt kann nun der Wert der Variable durch die Funktion SetLongField geändert werden. Die Funktion erwartet einen Verweis auf die Umgebung, das Objekt, die Variable und den neuen Wert als Parameter.

Zum setzen der long Variable wird hier die Funktion SetLongField verwendet. Allgemein stellt die JNI API für alle möglichen Typen Funktionen zum setzen von Werten zu Verfügung. Die Funktionsnamen haben alle den Aufbau Set<type>Field. Über die Möglichen Typen folgt später noch mehr.

Ein lesender Zugriff ist in den ersten beiden Schritten identisch mit einem schreibendem Zugriff. Nachdem die Klasse und die Variable bekannt ist, kann wie im nächsten Programmstück gezeigt auf eine Variable lesend zugegriffen werden.
	jl = (*env)->GetLongField(env, thisObj, fid_long);
			
Auch von dieser Funktion gibt es für jeden möglichen Datentyp eine passende Variante.

 

3.2 Zugriff auf Klassen Variablen

Der Zugriff auf Klassen Variablen ist fast identisch mit dem auf Objekt Variablen. Das nächste Programmstück zeigt einen Schreibzugriff auf eine Klassen Variable:

	clazz = (*env)->GetObjectClass(env, thisObj);
	
	fid_static_long = (*env)->GetStaticFieldID(env, clazz, "_static_long", "J");
	
	(*env)->SetStaticLongField(env, clazz, fid_static_long, ji++);
			
Der erste Unterschied sind die Funktionsnamen. So heißt die Funktionen zum Holen einer Variablenreferenz nicht mehr GetFieldID sondern GetStaticFieldID. Dem entsprechend enthält die Funktion zum setzen einer Variable auch das Wort static im Funktionsnamen. Der zweite unterschied liegt in den Parametern der Funktion SetStatic<type>Field. So wird jetzt die Referenz auf die Klasse übergeben und nicht auf das Objekt.

Die Funktion zum lesen einer Klassen Variable ist wie die Funktionen zum Schreiben leicht in ihrem Namen und ihren Parametern abgewandelt. Das kleine Programmstück zeigt ein Beispiel:
	jl = (*env)->GetStaticLongField(env, clazz, fid_static_long);
			
Der Funktionsname hat den folgenden Aufbau GetStatic<type>Field. An Stelle einer Objektreferenz als Parameter erhält sie eine Referenz auf eine Klasse.

 

3.3 Public / Private

Wie in den Beispielen gesehen gibt es bei dem Zugriff auf public Variablen und dem Zugriff auf private Variablen keinen Unterschied. Die Mechanismen für den Zugriff sind identisch. In JNI gibt es keine Zugriffsprüfung, so ist es auch möglich auf private Variablen anderer Klassen und Objekte einfluß zu nehmen. Im allgemeinen sollte diese Möglichkeit jedoch nicht genutzt werden.

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