Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 23 Java Native Interface (JNI)
gp 23.1 Java Native Interface und Invocation-API
gp 23.2 Die Schritte zur Einbindung einer C-Funktion in ein Java-Programm
gp 23.2.1 Schreiben des Java-Codes
gp 23.2.2 Compilieren des Java-Codes
gp 23.2.3 Erzeugen der Header-Datei
gp 23.2.4 Implementierung der Methode in C
gp 23.2.5 Übersetzen der C-Programme und Erzeugen der dynamischen Bibliothek
gp 23.2.6 Setzen der Umgebungsvariable
gp 23.3 Erweiterung unseres Programms
gp 23.4 Erweiterte JNI-Eigenschaften
gp 23.4.1 Klassendefinitionen
gp 23.4.2 Zugriff auf Attribute


Galileo Computing

23.3 Erweiterung unseres Programmstoptop

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/.





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de