|
|
|
Bridging the Gap

|
| von shark, 04.07.2001 21:35:53 |
[vote] |
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());
%> |
|
|
Hinweis: Auf dieser Seite liegen Links zu anderen Seiten im Internet. Für alle diese Links gilt: Wir
betonen ausdrücklich, daß wir keinerlei Einfluß auf die Gestaltung und die Inhalte der gelinkten Seiten
haben. Deshalb distanzieren wir uns hiermit ausdrücklich von allen Inhalten aller gelinkten Seiten auf
dieser Homepage und machen uns ihre Inhalte nicht zueigen. Diese Erklärung gilt für alle auf unserer
Homepage angebrachten Links
Redaktion/Betreiber von JSP-Develop übernehmen keinerlei Gewährleistung und Verantwortung für die Richtig-
und/oder Vollständigkeit von den auf den Webseiten JSP-Develop veröffentlichten Source Codes.
Die Verantwortung der Verwendung/Anwendung sowie etwaige Modifikation der hier veröffentlichten Sourcen
obliegt einzig dem Benutzer der Webseite, welche die veröffentlichten Sourcen in einer Applikation/Anwendung
einsetzt. Durch das Kopieren und/oder Benutzen der Sourcen in einer Applikation/Anwendung
bzw. etwaigen Abschriften wird dieser Rechtshinweis anerkannt.
Java, JSP, JavaServer Pages, J2EE, EJB, JDBC, JNDI, JTA, Sun, Sun Microsystems are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and in other countries.
IBM, WebSphere are trademarks or registered trademarks of International Business Machines Corporation.
Other trademarks and registered trademarks are the property of their respective owners.
|
|
|
|