23.3 Erweiterung unseres Programms
Wir haben unsere Funktion noch nicht zu Ende geführt. Es fehlt die Berechnung der Zeichenkettenlänge. Dazu müssen wir den String zuerst von der Unicode-Implementierung in ein C-Zeichenfeld überführen. Dazu dient eine Funktion GetStringUTFChars, die wir über die Umgebung env nutzen können.
jbyte* str = env->GetStringUTFChars( s, NULL );
Die Zeichenkettenlänge liefert die Funktion strlen(), die im Header string.h definiert ist:
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include "strlen.h"
JNIEXPORT jint JNICALL Java_StrLen_strlen( JNIEnv *env, jclass clazz, jstring s )
{
// printf( "Hallo Java-Freunde!\n" );
if ( s == NULL )
{
jclass exc = env->FindClass( "java/lang/NullPointerException" );
if ( exc != NULL )
env->ThrowNew( exc, "(in C++ code)" );
return -1;
}
const jbyte* str = env->GetStringUTFChars( s, NULL );
if ( str == NULL )
return -1;
int len = strlen( str );
env->ReleaseStringUTFChars( 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.
Eine intensivere Auseinandersetzung mit diesem Thema findet sich auf den Web-Seiten von Sun unter http://java.sun.com/docs/books/tutorial/native1.1/.
|