26.3 Nativ die Stringlänge ermitteln 

Wir haben unsere Funktion noch nicht zu Ende geführt. Es fehlt die Berechnung der Zeichenkettenlänge, für die wir den String zuerst von der Unicode-Implementierung in ein C-Zeichenfeld überführen müssen. Dazu dient eine Funktion GetStringUTFChars(), die wir über die Umgebung env nutzen können. [Siehe dazu unter http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html den Punkt »Native Method Arguments«. ]
const char* str = (*env)->GetStringUTFChars( env, s, NULL );
const char* str = (*env)->GetStringUTFChars( env, s, NULL ); heißt, schreiben wir bei C++ const char* str = env->GetStringUTFChars( s, NULL ); In der objektorientierten C++-Variante ist env als Argument nicht mehr nötig. Wir bleiben bei unseren Buchbeispielen in der prozeduralen C-Welt und übergeben daher allen JNI-Methoden das JNIEnv.1 |
Die Zeichenkettenlänge liefert die C-Funktion strlen(), die im Header string.h definiert ist:
#include <jni.h> #include "strlen.h" #include <stdio.h> #include <string.h> JNIEXPORT jint JNICALL Java_com_tutego_jni_StrLen_strlen( JNIEnv *env, jclass clazz, jstring s ) { if ( s == NULL ) { jclass exc = (*env)->FindClass( env, "java/lang/NullPointerException" ); if ( exc != NULL ) (*env)->ThrowNew( env, exc, "(in C++ code)" ); return –1; } const char* str = (*env)->GetStringUTFChars( env, s, NULL ); if ( str == NULL ) return –1; int len = strlen( str ); (*env)->ReleaseStringUTFChars( env, s, str ); return (jint) len; }
Mit JNI lassen sich auf der C-Seite Java-Objekte erzeugen und zerstören, genauso wie sich Java-Methoden aufrufen und Werte austauschen lassen. Wir nutzen das, um ein Ausnahme-Objekt zu erzeugen, wenn es keine Referenz auf ein String-Objekt gibt.