# Funktionen einer dll aufrufen



## Calamitous (16. Jan 2004)

hallo!
Bin noch etwas neu in Java... (vielleicht ist die Frage doof, weil es entweder leicht oder gar nicht geht 
aber weiß jemand wie ich eine Funktion (einer dll) aufrufen kann?
danke schon mal für ideen/ lösungen


----------



## René Link (17. Jan 2004)

Hi,

kennst du dich mit JNI (Java Native Interface) aus.
Mit JNI kannst du C-Code aus Java aufrufen. Was du nicht kannst ist eine
Funktion einer DLL aufrufen, die nicht für JNI kompiliert wurde. Aber du
kannst eine Indirektionsstufe einführen, indem du eine Funktion in einer
C-Datei schreibst, diese dann für JNI kompilierst und dann rufst du deine
Funktion auf. Diese mapped dann den Aufruf auf die eigentliche DLL.

JNI funktioniert folgendermaßen:






Hier eine Java-Klasse die JNI benutzt.


```
public class JavaNativeInterfaceTest {

  public static native void printSomething();

  public static void main(String[] args) {
    System.loadLibrary("JNI");                // meine DLL trägt den Namen JNI.dll
    JavaNativeInterfaceTest.printSomething();
  }
}
```

Und das ist die erzeugte c-header-Datei von javah

```
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JavaNativeInterfaceTest */

#ifndef _Included_JavaNativeInterfaceTest
#define _Included_JavaNativeInterfaceTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JavaNativeInterfaceTest
 * Method:    printSomething
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_JavaNativeInterfaceTest_printSomething
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif
```


Hier noch der c-Code

```
#include <stdio.h>
#include <JavaNativeInterfaceTest.h>

JNIEXPORT void JNICALL Java_JavaNativeInterfaceTest_printSomething(JNIEnv *, jclass){
	printf("Something");
}
```


Wenn du die DLL erzeugt hast, muss sich diese unter Windows in einem Verzeichnis befinden, welches in der
PATH-Umgebungsvariablen angegeben ist. Wenn du mehr Informationen brauchst, wie zum Beispiel das Übergeben
von Argumenten und das Zurückgeben von Rückgabewerten funktioniert, solltest du dich auf der Sun Seite umsehen.
http://java.sun.com/docs/books/tutorial/native1.1/


----------



## Gast (23. Jan 2004)

Hallo,

xFunction von Excelsior bietet die Möglichkeit Funktionen aus einer bel. DLL aufzurufen 
http://www.excelsior-usa.com/xfunction.html


----------



## René Link (23. Jan 2004)

Hi,

die Variante von Excelsior Store benutzt aber auch die Java Native Interface ( ohne die gehts nicht ).
Das sieht man auch daran, dass die auch eine dll mitliefern. Den einzigen Unterschied denn ich sehe ist, dass
Excelsior Store eine adaptive Variante implementiert hat und somit den Umstand behebt, für jede benötigte
Funktion ein Mapping einzuführen. Allerdings kostet die Variante von Excelsior Store auch je nach Lizenz zwischen
$50 und $500. Deshalb würde ich die paar Funktionen, welche wirklich unausweichlich benötigt werden, selbst mappen. Das kostet mich nichts außer 1-2 Stunden arbeit. In Außnahmefällen ist es wohl gerechtfertigt auf
soetwas wie xFunction zurückzugreifen. Allerdings sollte man sich im klaren darüber sein, dass man mit jeder
Nutzung von JNI die Plattformunabhängigkeit aufgibt um den Preis für jede unterstützte Plattform eine Lib liefern
zu müssen. JNI macht für mich nur Sinn, wenn es auf der Server Seite eingesetzt wird. Die Clients bleiben
Plattformunabhängig, während man auf dem Server JNI benutzt. Ändert man etwas muss man nur für den
Server eine neue Lib kompilieren.  Ein anderen Sinn sehe ich darin ( und das wird auch die Intension von Sun gewesen sein ),
dass ich mit Hilfe der JNI meine bereits bestehenden Libs ( die mich wahrscheinlich schon Tage und Nächte gekostet haben sie zu erstellen und die Bugs zu beseitigen ), weiter verwenden kann ohne eine Neuimplementierung in Java
vornehmen zu müssen die mich wieder Tage und Nächte kostet.
Man sollte sich immer vor Augen halten was und wofür man etwas braucht und dann das Werkzug auswählen.
Auf gut deutsch meine ich, dass man nicht verzweifelt versuchen sollte mit einem Stein einen Nagel krumm und schief in die Wand zu hauen, nur weil man nicht weiß was ein Hammer ist oder wie er funktioniert.  :wink: 
Also ... die Aufgabe bestimmt das Werkzeug nicht umgekehrt.
Jetzt bin ich zwar ein wenig vom eigentlichen Thema abgekommen, aber das wollte ich schon immer mal sagen.


----------

