7. September 2010  
  Suche:
 
  Basics
  Code-Galerie
  Forum
  FAQ
  Tipps & Tricks
  Literatur
  Knowledge Base
  Workshops
  JSP-Hosting
  JSP-Engines
  Jobbörse
  Links
  JSP-Sites
  Newsletter
  JSP-Test
  Impressum
  Username:
  
  Passwort:
  
  

  Jetzt registrieren
  Warum registrieren?

  Valid HTML 4.01!
  Valid CSS!

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());
%>
[Druckansicht]    [Beitrag versenden]
<< zurück  Kommentieren


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.