JNI - java.lang.UnsatisfiedLinkError

Bob

Mitglied
Hallo,

ich habe ein kleines Problem mit der Einbindung einer DLL.
Wenn ich versuche Funktionen aus der DLL zu benutzen bekomme ich einen "UnsatisfiedLinkError". Das Einbinden / Laden der DLL scheint zu funktionieren (die Exception kommt nur, wenn ich die Funktion aus der DLL benutze).

Ich habe versucht mich an das Beispiel aus "The Java Native Interface Programmer's Guide and Specification" zu halten.

Hier mal mein Java-Code:

Java:
public class HelloWorld {

	private native void print();

	public static void main(String[] args) {
		new HelloWorld().print();
	}
	
	static {
      System.loadLibrary("HelloWorld");
	}

}

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

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

und die .c-Datei:

Code:
 #include <jni.h>
 #include <stdio.h>
 #include "HelloWorld.h"

 JNIEXPORT void JNICALL
 Java_HelloWorld_print(JNIEnv *env, jobject obj)
 {

     printf("Hello World!\n");
     return;
 }

Ich bekomme zur Laufzeit dann folgende Exception:
Java:
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.print()V
	at HelloWorld.print(Native Method)
	at HelloWorld.main(HelloWorld.java:7)


Kann mir jemand sagen wieso ich die Exception bekomme.

Danke & mfG
Bob

Edit: Den ClassPath hab ich natürlich gesetzt: -Djava.library.path=.\bin
 
Zuletzt bearbeitet:

Bob

Mitglied
Habs probiert den Pfad absolut anzugeben. Das bringt aber die gleiche Exception.

Wenn bewusst einen falschen Pfad angebe kommt zwar noch die UnsatisfiedLinkError -Exception allerdings ist die Message eine andere:
Java:
java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path
	at java.lang.ClassLoader.loadLibrary(Unknown Source)
	at java.lang.Runtime.loadLibrary0(Unknown Source)
	at java.lang.System.loadLibrary(Unknown Source)
	at HelloWorld.<clinit>(HelloWorld.java:11)

Ich geh' also davon aus, dass er die dll zumindest findet.
 

Marco13

Top Contributor
Ja, beim ersten hat er sie noch gefunden. Liegt die Klasse in irgendeinem Package? Ansonsten ggf. mal das loadLibrary ganz an den Anfang der Klasse packen (sollte eigentlich keinen Unterschied machen, aber ... )
 

Bob

Mitglied
die klasse liegt im default package.
Hab den static-Block auch an den Anfang geschoben ... hat keine Veränderungen gebracht
 

Marco13

Top Contributor
Ja, war auch eher hilflos rum-geraten :oops: Sicher dass nicht irgendeine ältere DLL im Verzeichnis liegt? Beim drüberschauen sehe ich zumindest keinen Fehler, wenn's partout nicht klappt kann ich morgen abend vielleicht mal schauen, was rauskommt, wenn man das compiliert...
Wie hast du das im Moment compiliert? (OS/Compiler...)
 

Marco13

Top Contributor
Da würde eine andere Meldung kommen ("Cannot load an IA64-Library .. " oder so). Die erste Fehlermeldung deutete darauf hin, dass er die DLL findet und laden kann, aber keine passende "print"-Methode darin gefunden wurde ???:L
 

Kr0e

Gesperrter Benutzer
@Marco13:

Nein, nicht unbedingt. Ich hab das mal bei GSTreamer-Java gemerkt. Die Bindings gibt es nich für 64 bit und die Fehlermeldung war dann ähnlich, nämlich, dass er eine Methode nicht finden kann... Ich hab mich auch extremst gewundert, weil es auf einem anderen PC lief... 32 bit!

Auch wenn es vlt in diesem Fall etwas anderes ist, kann ich deine Aussage so nicht stehen lassen :p
Die in C/C++ kompilierten Dll Dateien deklarieren die Funktionen z. T. mit Hilfe des Präprozessors, sprich ein Code wird nur kompiliert, wenn das System 32bit ist. Bei solchen Sachen können durchaus Fehlermeldungen wie diese auftreten ;)
 

Marco13

Top Contributor
Ah, MinGW und GCC und so... da gibt's ein paar Schwierigkeiten... da muss man AFAIK irgendwie mit dem DLLTool rumpfuschen, weil die Namen der Funktionen bei Windows irgendwie nicht so ein Name@1b42 hinten dran haben oder so (*dunkle Erinnerung*). Ich hatte mir da mal was notiert, werde mal schauen, ob ich das noch finde...
 

Bob

Mitglied
Auf jeden Fall erstmal danke für den Hinweis.

Kannst du mir denn einen anderen Compiler empfehlen, der das Problem nicht hat?
 

Marco13

Top Contributor
Ja, hab nochmal geschaut, aber ich glaube das hatte doch nicht direkt damit zu tun (war eine Mail von Anfang 2008... :oops: ) - da gng es darum, dass man eine .lib-Datei nicht mit MinGW verwenden konnte, um eine JNI-DLL draus zu bauen.
Ich verwende üblicherweise Visual Studio (Express Edition ist Kostenlos), aber ich hab's gerade mit einer steinalten IDE (Dev-Cpp) und einem alten MinGW/GCC getestet und das hat wohl funktioniert. Kann gut sein, dass nur irgendwelche Compiler-Flags fehlen, aber welche das beim GCC sein könnten... da bin ich nicht so auf dem Laufenden (Ein Hoch auf den "Compile"-Button moderner IDEs :D ).
Welchen Compiler und welche Kommandozeilen verwendest du denn im Moment?
 

Bob

Mitglied
Ich habe im Moment leider keine Zeit weiter an diesem Problem zu arbeiten ...

Ich werde mich aber auf jeden Fall bald wieder diesem Problem widmen.
 

Bob

Mitglied
Hallo,
wie versprochen muss ich das Probelm jetzt wieder aufwärmen ...

Die gute Nachricht: Inzwischen funktionieren meine erstellten dlls wieder.
Die Schlechte: Ich weiß nicht genau warum.

Ich hatte vor 4 Wochen nach dem Tip bzgl. MinGW und GCC in Verbindung mit JNI (thx Marco13) noch ein bisschen mit den Compiler-Optionen rumgespielt. Allerdings hat es damals trotzdem nicht funktioniert.
Auf jeden Fall funktioniert es jetzt wieder ... mal sehen wie lange noch ;-)

Hier mal vielleicht mal die Kommando-Zeile:

Code:
gcc -IC:\Programme\Java\jdk1.6.0_21\include -IC:\Programme\Java\jdk1.6.0_21\include\win32 -IC:\Dokumente und Einstellungen\Markus\workspace\NativHelloWorld_JavaProject\bin -O0 -g3 -Wall -c -fmessage-length=0 -oHelloWorld.o ..\HelloWorld.c
gcc -Wl,-kill-at -shared -olibNativeHelloWorld_CppProject.dll HelloWorld.o

Vielleicht hilft das ja noch jemandem weiter ...

Grüße und nochmal danke für die Unterstützung

Bob
 

Kr0e

Gesperrter Benutzer
Ich habe inzwischen auch damit gearbeitet und ähnlcihe Probleme gehabt. Du nutzt das hier: gcc -Wl,-kill-at!!

Das war die Lösung bzw. ich habs dann mit MSVC++ gemacht und damit gings dann direkt. Diese Option verbietet dem C COmpiler, dass der an die Funktionen so dumme @12 @8 Annotations macht. Java findet dann die Methodenrümpfe nicht mehr, da die Methoden dann z.B. ()Vprint@8 heißen etc...

Warum es jetzt auf einmal klappt kann ich dir nicht sagen, aber deine Meldung ist ein eindeutiger Hinweis:

Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.print()V
at HelloWorld.print(Native Method)
at HelloWorld.main(HelloWorld.java:7)

Das heißt, dass die DLL schon gefunden wurde aber die Methode eben nciht ;)

Gruß,

Chris
 

Marco13

Top Contributor
Ich habe inzwischen auch damit gearbeitet und ähnlcihe Probleme gehabt. Du nutzt das hier: gcc -Wl,-kill-at!!

Das war die Lösung bzw. ich habs dann mit MSVC++ gemacht und damit gings dann direkt. Diese Option verbietet dem C COmpiler, dass der an die Funktionen so dumme @12 @8 Annotations macht. Java findet dann die Methodenrümpfe nicht mehr, da die Methoden dann z.B. ()Vprint@8 heißen etc...

Hmgrlmpf ... :autsch: genau DArum ging es in der alten Mail, die ich da erwähnt hatte - aber da ging es darum, dass ich die dann mit DLLTool, Texteditor, DEF-Dateil-Export und anderen Krämpfen so zurechgestümpert habe, dass sie funktioniert haben ... dabei hätte es ein einfaches Compile-Flag schon getan... gut zu wissen :rtfm:
 

Kr0e

Gesperrter Benutzer
Wenn du den MSVC++ Compiler nutzt, dann brauchst du das Flag komischerweise nicht, ich weiß nicht warum. Liegt nach mehreren Aussagen wohl am MinGW...
 

Marco13

Top Contributor
Ja, ich hatte mich da nur reingefräst, weil jemand eine Bibliothek mit minGW compilieren wollte, und das nicht ging wegen dieser fehlenden @41-Dinger. Aber ... beim zweiten Nachdenken glaube ich, dass das Problem auftrat, weil diese Dinger nicht in seiner eigenen Bibliothek gefehlt haben, sondern in einer, die er nur verwenden wollte (und die vielleicht mit MSVC compiliert war), d.h. vielleicht war der K(r)ampf mit dem DLLTool und den DEF-Dateien gar nicht sooo überflüssig...
 
D

Die_ELFE

Gast
ist zwar schon lange her, aber vllt hilft es ja noch jemandem...

Ich habe das obige Beispiel auf nem win7 x64 Rechner getestet und bin zu dem Ergebnis gekommen, dass es nicht am MinGW liegt, sondern an der verwendeten JDK bzw JRE

Mit Version 7.03 läuft alles ohne Probleme
Mit Version 7.07 bekomme ich den LinkError

Compileraufruf
Code:
"C:\Program Files\Java\jdk1.7.0_03\bin\javac.exe" -classpath "D:\Workspace\test" -d "C:\Users\XXX\XXX\BDllGen\temp" "D:\Workspace\test\src\HelloWorld.java"

Code:
"C:\Program Files\Java\jdk1.7.0_03\bin\javah.exe" -jni -o "D:\Workspace\test_c\src\HelloWorld.h" -classpath "C:\Users\XXX\XXX\BDllGen\temp" "HelloWorld"

Code:
"C:\Program Files (x86)\MinGW\bin\gcc.exe" -I "C:\Program Files\Java\jdk1.7.0_03\include" -I "C:\Program Files\Java\jdk1.7.0_03\include\win32" -shared -Wl,--add-stdcall-alias -o "D:\Workspace\test\src\HelloWorld_x86.dll" "D:\Workspace\test_c\src\test_c.c"

Code:
"C:\Program Files\MinGW\bin\x86_64-w64-mingw32-gcc.exe" -I "C:\Program Files\Java\jdk1.7.0_03\include" -I "C:\Program Files\Java\jdk1.7.0_03\include\win32" -shared -Wl,--add-stdcall-alias -o "D:\Workspace\test\src\HelloWorld_x64.dll" "D:\Workspace\test_c\src\test_c.c"


Das würde auch erklären, warum sich das Problem bei BOB irgendwann von alleine löste.

Gruß,
Die_ELFE
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
N Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.p Allgemeine Java-Themen 4
I java.lang.UnsatisfiedLinkError: Allgemeine Java-Themen 8
D java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 5
S java.lang.UnsatisfiedLinkError mit JNI Allgemeine Java-Themen 6
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
F Fehlermeldung: java.lang.NoClassDefFoundError: org/apache/commons/net/ntp/NTPUDPClient Allgemeine Java-Themen 6
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
H Java Mail Fehlermeldung: java.lang.NoClassDefFoundError: javax/mail/internet/AddressException Allgemeine Java-Themen 5
Crooda Compiler-Fehler java.lang.NoClassDefFoundError bitcoinj Allgemeine Java-Themen 1
I Fehler java.lang.NullPointerException Allgemeine Java-Themen 5
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
H java.lang.NullPointerException Allgemeine Java-Themen 5
L Interpreter-Fehler java.lang.NullPointerException Allgemeine Java-Themen 17
F java.lang.ClassNotFoundException: .class Allgemeine Java-Themen 5
S java.lang.NoClassDefFoundError Allgemeine Java-Themen 5
J Compiler-Fehler java.lang.StringIndexOutOfBoundsException Allgemeine Java-Themen 12
D java.lang.TypeNotPresentException Allgemeine Java-Themen 3
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
L java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 10
S javadoc java.lang.NullPointerException Allgemeine Java-Themen 2
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
B Variable class in java.lang.Object Allgemeine Java-Themen 11
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
T ProcessBuilder (java.lang.NoClassDefFoundError) Allgemeine Java-Themen 2
T java.lang.AssertionError: Allgemeine Java-Themen 4
T java.lang.ClassCastException: Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
B java.lang.UnsupportedClassVersionError Allgemeine Java-Themen 12
M cannot be cast to java.lang.Comparable Allgemeine Java-Themen 5
E Interpreter-Fehler java.lang.ExceptionInInitializerError Allgemeine Java-Themen 12
C java.lang.ClassCastException Allgemeine Java-Themen 3
P Fehler beim Programmstart: java.lang.NoClassDefFound Allgemeine Java-Themen 12
T java.lang.ClassCastException Allgemeine Java-Themen 7
B Java - java.lang Allgemeine Java-Themen 12
sylo java.lang.NoSuchMethodError: Obwohl Methode vorhanden Allgemeine Java-Themen 8
MonsterBit java.lang.NullPointerException Allgemeine Java-Themen 2
H Applet java.lang.reflect.InvocationTargetException Allgemeine Java-Themen 9
M SerialPort RS232 : java.lang.NoSuchFieldError: eis Allgemeine Java-Themen 2
U java.lang.ClassNotFoundException: .jar Allgemeine Java-Themen 8
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
W java.lang.ClassCastException Allgemeine Java-Themen 10
N java.lang.InstantiationException Allgemeine Java-Themen 10
J java.lang.NullPointerException bei Threadprogrammierung Allgemeine Java-Themen 9
D replaceAll => no such java.lang.NoSuchMethodError Allgemeine Java-Themen 5
G java.lang.LinkageError: loader constraints violation. Allgemeine Java-Themen 3
O java.lang.NumberFormatException für normalen integer Allgemeine Java-Themen 4
G Javadoc generiert keine Links zu java.lang Klassen? Allgemeine Java-Themen 4
Y java.lang.UnsupportedClassVersionError: Allgemeine Java-Themen 5
G java.lang.ClassCastException Allgemeine Java-Themen 3
J Fehler: java.lang.NullPointerException Allgemeine Java-Themen 2
E java.lang.outofmemory über windows-cmd ändern Allgemeine Java-Themen 6
J Folgender Fehler: java.lang.NullPointerException Allgemeine Java-Themen 4
J Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 26
J java.lang.StackOverflowError Debugging? Allgemeine Java-Themen 51
S Fortran Funktion mit JNI aufrufen: java.lang.UnsatisfiedLink Allgemeine Java-Themen 2
reibi java.lang.Class - Resource - Solaris Allgemeine Java-Themen 17
S Exception in Thread "main" java.lang.NoClassDef. b Allgemeine Java-Themen 2
M java.lang.UnsupportedClassVersionError: Bad version number i Allgemeine Java-Themen 5
J java Thread java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 7
O "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBounds Allgemeine Java-Themen 6
B Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 12
G Error: java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 2
S java.lang.OutOfMemoryError: Java Allgemeine Java-Themen 22
G java.lang.NullPointerException JFreeChart Allgemeine Java-Themen 5
E Java Fehlermeldung java.lang.NoClassDefFoundError Allgemeine Java-Themen 3
G Problem mit java.lang.reflect.Field Allgemeine Java-Themen 15
P Kompilerfehler: at java.lang.ClassLoader.loadClassInternal(U Allgemeine Java-Themen 16
M java.lang.NullPointerException im Chatclient Allgemeine Java-Themen 12
H java.lang.ExceptionInInitializerError Allgemeine Java-Themen 7
D java.lang.IllegalMonitorStateException: current thread not Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 15
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
T Profifrage: java.lang.StackOverflowError bei BigInteger Allgemeine Java-Themen 27
M java.lang.OutOfMemoryError Allgemeine Java-Themen 2
W java.lang.ClassNotFoundException Allgemeine Java-Themen 10
F java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 22
B Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 5
S fehlermeldung java.lang.OutOfMemoryError Allgemeine Java-Themen 5
B java.lang.NullPointerException Allgemeine Java-Themen 11
S Exception in thread "main" java.lang.StringIndexOu Allgemeine Java-Themen 9
H Skalieren von Image -> java.lang.OutOfMemoryError - WARUM Allgemeine Java-Themen 18
J java.lang.ArrayIndexOutOfBoundsException Allgemeine Java-Themen 2
P Hilfe zu java.lang.Object Allgemeine Java-Themen 3
K java.lang.reflect - Getter und Setter ermitteln Allgemeine Java-Themen 8
G jTable-Problem --> java.lang.OutOfMemoryError Allgemeine Java-Themen 5
G Java.lang.Compiler Allgemeine Java-Themen 3
E Exception in Thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 5
F java.lang.OutOfMemoryError Allgemeine Java-Themen 13
R java.lang.String maximale Anzahl der Zeichen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben