|
jsp-develop.de presents: Bridging the Gap |
| von shark, 04.07.2001 21:35:53 |
|
Die über Jahre hinweg gewachsene Software in den Unternehmen (Legacy Systeme) kann in vielen Fällen nicht von heute auf morgen durch ein modernes IT-System (Application Server, CORBA, etc.) ersetzt werden. Es wurde von den Unternehmen viel Zeit und Geld investiert um den Geschäftsbetrieb am laufen zu halten und die Dynamik im IT-Bereich hat so manchen Verantwortlichen davon abgehalten jeden Hype mitzumachen. Die Aussage: "Never change a running System" hat noch nicht an Bedeutung verloren. Übrigens das gleiche gilt auch für diese Aussage: "Never change a winning team". Im Zuge des E-Commerce Booms bieten ältere Systeme nicht die Funktionen wie beispielsweise Application Server die eine Reihe von Laufzeitservices (Transaction, Security, Persistence, Naming, CORBA Integration, Messaging, etc.) anbieten. Deswegen ist der Bedarf für eine Schnittstellen wie das Java Native Interface (JNI) zur Kopplung von Java Anwendungen mit Legacy Systemen vorhanden. Die JNI API bietet die Möglichkeit Funktionen und Bibliotheken die nicht in Java entwickelt wurden aufzurufen (Bridging the Gap). Auf der Serverseite können über JNI bestehende Anwendungen die in C/C++, etc. entwickelt wurden an ein Java System angebunden werden. Der Einsatz des JNI führt automatisch zu plattformabhängigem Code! Die gängige Java Formel: "write once, run everywhere" gilt nicht für Java Programme die JNI-Aufrufe verwenden. In dem nachfolgenden Beispiel wurde eine Bibliothek entwickelt (windll.dll) die eine Funktion getValue() enthält. Die Funktion getValue() wird in einer JSP-Seite aufgerufen und der in der Bibliothek definierte Text "Hallo!" im Browser ausgegeben. Folgende Schritte sind dazu nötig: ------------------------------------------------ (1) Schreiben einer Java Klasse (in unserem Fall --> JNIWrapper), welche die Native Methoden enthält (Java Schlüsselwort native beachten!) (2) Kompilieren der Java Klasse mit "javac" (3) Erzeugen einer C/C++ Header-Datei mit dem Tool "javah" --> Es sollte der komplette Package Name der Klasse angegeben werden --> z.B.: "javah de.shark.jni.JNIWrapper" --> Das Ergebnis ist eine Header-Datei die zu der C/C++ Bibliothek gebunden wird, welche die Funktion enthält die innerhalb der JSP-Seite aufgerufen wird (4) Schreiben der Bibliothek (in unserem Fall windll.dll) --> Achtung es muss in dem verwendeten "make file" bzw. der IDE der Include (/include und include/win32) und Lib Pfad des installierten JDKs gesetzt werden. Ausserdem bindet man die Library "jvm.lib" zu der C/C++ Bibliothek. (5) Schreiben der JSP-Seite in der das Java Package eingebunden und die realiserte Java Klasse aufgerufen wird. Die entwickelte Bibliothek windll.dll kopiert man in das JSP-Verzeichnis. Beispiel Source Code: ------------------------------- Zu 1.) package de.shark.jni; public class JNIWrapper { static { try { // Bibliothek laden (Bibliotheksname ohne Extension verwenden!) System.loadLibrary("windll"); } catch(Exception ex) { ex.printStackTrace(); } } // Native Methode public native String getValue(); } Zu 3.) /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class de_shark_jni_JNIWrapper */ #ifndef _Included_de_shark_jni_JNIWrapper #define _Included_de_shark_jni_JNIWrapper #ifdef __cplusplus extern "C" { #endif /* * Class: de_shark_jni_JNIWrapper * Method: getValue * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_de_shark_jni_JNIWrapper_getValue (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif Zu 4.) #include "de_shark_jni_JNIWrapper.h" char arrayName[] = {"Hallo!"}; /* * Class: de_shark_jni_Wrapper * Method: getValue * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_de_shark_jni_JNIWrapper_getValue (JNIEnv *pEnv, jobject obj) { return (jstring) (pEnv)->NewStringUTF(arrayName); } Zu 5.) <%@ page language= "java" contentType="text/html"%> <%@ page import = "de.shark.jni.*"%> <% // JNIWrapper Instanz erzeugen JNIWrapper oWrapper = new JNIWrapper(); // Native Methode aufrufen und String der in windll definiert ist ausgeben out.println("Ausgabe der Native Methode: " + oWrapper.getValue()); %> |
|
URL dieses Beitrags: http://www.jsp-develop.de/forumbeitrag/view/116/ |