21.4 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 JNI-Funktion GetStringUTFChars(), die wir über die Umgebung env nutzen können.
const char* str = (*env)->GetStringUTFChars( env, s, NULL );
Hinweis |
Die Schreibweisen unterscheiden sich im Fall von C oder C++. Während es bei C 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-Funktionen das JNIEnv.[116](Siehe dazu unter http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html den Punkt »Native Method Arguments«.) ] |
Die Zeichenkettenlänge liefert die C-Funktion strlen(), die im Header string.h definiert ist:
Listing 21.7: strlen.c
#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.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.