java.lang.UnsatisfiedLinkError mit JNI

Status
Nicht offen für weitere Antworten.

Sonjaja

Mitglied
Hallo!
Ich versuche unter Windows eine einfache JNI Anwendung (HelloWorld) zum laufen zu bringen. Ich kann das Java Programm kompilieren, die C- header datei erzeugen, die dll erzeugen, aber bei der Ausführung tritt folgender Fehler auf.

Exception in thread "main" java.lang.UnsatisfiedLinkError: afficheCpp
at Bonjour.afficheCpp(Native Method)
at Bonjour.main(Bonjour.java:26)

Der Teil des Java Programmes funktioniert noch, nur das C++ Programm will nicht. Ich glaube auch nicht, dass es daran liegt, dass die dll nicht im LibraryPath ist, da folgender Fehler auftritt, wenn ich die dll lösche:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloW in java.lib
rary.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at Bonjour.<clinit>(Bonjour.java:19)

Mein Java Programm sieht folgendermaßen aus:

Code:
public class Bonjour {
    
    public native void afficheCpp();
    
    //chargement de la librairie c++ HelloWorld
    static {System.loadLibrary("HelloW"); }
    
    
    
    public static void main (String[] args)
    {
        System.out.println("coucou (en java)\n");
        new Bonjour().afficheCpp();        
    }
    
    
}

das C++ Programm wie folgt:

code]#include <jni.h>
#include "HelloW.h"
#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_Bonjour_afficheCpp (JNIEnv *env, jobject obj)
{
cout<<"Ich heisse Sonja ( en C++)"<<endl;

}[/code]

und die C++ Header Datei wie folgt:

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

#ifndef _Included_Bonjour
#define _Included_Bonjour
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Bonjour
 * Method:    afficheCpp
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Bonjour_afficheCpp
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


Ich hab' schon alles mögliche ausprobiert, und habe keine Ahnung was ich noch ausprobieren soll. Vielleicht kann mir einer von Euch weiter helfen?

Sonja
 
Sonjaja hat gesagt.:
Der Teil des Java Programmes funktioniert noch, nur das C++ Programm will nicht. Ich glaube auch nicht, dass es daran liegt, dass die dll nicht im LibraryPath ist, da folgender Fehler auftritt, wenn ich die dll lösche:
Und wenn du die DLL nicht löschst (warum überhaupt?) und wenn sie im gleichen Verzeichnis wie
dein Programm oder in LibraryPath vorhanden ist?
Die Lib-Datei ist nur für den Linker interessant, dein Java-Programm kann damit nix anfangen.
 
wenn ich die dll im gleichen Verzeichnis lasse tritt der erste Fehler auf, d.h. die dll wird gefunden, aber die Methode afficheCpp kann nicht gestartet werden. Das ist auch das Problem was mir Kopfzerbrechen bereitet. Ich habe schon alle möglichen Googleseiten abgesucht. Das einzige was ich gefunden habe ist, dass die Funktionsbezeichnungen in der .h und der .cpp Datei gleich sein müssen, aber das sind sie ja. Unter Linux läuft das Programm auch, nur unter Windows nicht. Ich verwende die Java Version jdk1.5.0_06 und den g++ Kompiler. Könnte es an irgendwelchen Versionen liegen?
Sonja
 
Das liegt an dem bescheuerten GNU-Compiler. Ich habe es nie verstanden, wie man den unter Windows
vernünftig zum Laufen bringt. Mit dem Compiler von MS geht es einwandfrei.
Code:
cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 /EHsc -LD hellow.cpp -Fehellow.dll
Wie compilierst du es mit dem gpp, ohne dass Fehlermeldungen zur Syntax der jni.h Datei kommen?
Kann es sein, dass zur Laufzeit irgendwelche Cygwin-DLLs fehlen?
 
Ich hab' den MinGW Kompiler, und der hat sich beim kompilieren nicht beschwert. Ich habe auch probiert die jni_md.h Datei zu verändern

Code:
typedef long jint;
#ifdef __GNU__
typedef long long jlong;
typedef signed char jbyte;
#else
typedef __int64 jlong;
#endif 
typedef signed char jbyte;

allerdings ändert das an meinem Problem nichts. Das Problem ist auch das gleiche, je nachdem ob ich ein C-Programm schreibe und mit gcc kompiliere oder C++ mit g++.
Aber danke für den Typ mit dem MS Kompiler, das probier ich gleich mal!
 
hab' die Lösung! Es funktioniert doch mit dem GNU Compiler. Man muss noch eine .def Datei mit folgendem Inhalt erstellen und diese bei der Kompilation der dll hinzufügen.

gcc -o Bonjour.dll -shared -IC:\Java\jdk1.5.0_06\include -IC:
\Java\jdk1.5.0_06\include\win32 Bonjour.c Bonjour.def


Bonjour.def

Code:
EXPORTS
Java_Bonjour_afficheCpp

Danke nochmal für die Mithilfe!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben