24.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.
jbyte* str = (*env)->GetStringUTFChars( env, s, NULL );
Die Zeichenkettenlänge liefert die 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_javatutor_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 jbyte* str = (*env)->GetStringUTFChars( env, s, NULL );
if ( str == NULL )
return –1;
int len = strlen( str );
(*env)->ReleaseStringUTFChars( env, s, str );
return (jint) len;
}
Mit dem JNI lassen sich unter C Java-Objekte erzeugen und zerstören; es kann auf Java-Methoden zugegriffen, und Parameter können ausgetauscht werden. Wir nutzen das, um ein Ausnahme-Objekt zu erzeugen, wenn es keine Referenz auf ein String-Objekt gibt.
|