# UnsatisfiedLinkError -JD2XX.dll - Bin am verzweifeln



## ub007 (23. Mrz 2010)

Hallo !

Ich habe ein Projekt bei mir daheim wo wunderbar läuft. Ich mußte noch nicht mal viel einstellen um die jar-Files einzubinden und anzusprechen.
Jetzt mußte ich das ganze auf einen anderen Rechner installieren. Dort war noch kein Java drauf und somit schraubte ich jdk1.6.0-18 drauf.
Programm rübergeholt und siehe da, nichts geht !
Nach langem hin und her konnte ich zumindest die jar Files reinholen, aber es kommt immer wieder:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: D:\Programme\Java\jdk1.6.0_18\jre\bin\JD2XX.dll: Die angegebene Prozedur wurde nicht gefunden
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at ellips1.MyUSB.<init>(MyUSB.java:14)
        at ellips1.Ellips1View.<init>(Ellips1View.java:41)
        at ellips1.Ellips1App.startup(Ellips1App.java:19)
BUILD SUCCESSFUL (total time: 1 second)

In oben besagten Pfad ist die JD2XX.dll vorhanden ( Ich habs mit eigenen Augen gesehen ! )
Ich habe in NetBeans auch unter Set Project Properties unter Arguments folgenden Angabe drin:
-Djava.library.path=G:\Bla1\Bla2\Neu\lib wo die zwei Files jar-File und DLL drin sind angegeben, aber
dennoch kommt diese Meldung.
Wer kann mir helfen ?

Gruß Uli


----------



## hansmueller (23. Mrz 2010)

Hallo,

die JD2XX.dll ist im jdk gar nicht enthalten. (Zumindest bei mir nicht.)

Es handelt sich dabei um eine Bibliothek für USB-Seriell Wandler mit FTDI Chip.
Diese dll-Datei sollte sich bei Windows im Verzeichnis C:\Windows\system32 befinden.
Siehe Java Programierung Windows ? c't-Bot Wiki

Ich habe noch nie mit dieser Bibliothek gearbeitet, aber so wie es aussieht, muß man den Treiber installieren. Ein einfaches umherschieben von Dateien dürfte nicht funktionieren.

Dies ist die Homepage für JD2XX: D2XX Direct Drivers

Lade die Version herunter, die du brauchst, installiere diese und schau, das die Pfade für dein Java-Programm alle stimmen.

MfG
hansmueller


----------



## Murray (23. Mrz 2010)

ub007 hat gesagt.:


> In oben besagten Pfad ist die JD2XX.dll vorhanden ( Ich habs mit eigenen Augen gesehen ! )


Das Programm sucht lt. Fehlermeldung in D:\Programme\Java\jdk1.6.0_18\jre\bin; da sollte die DLL besser nicht sein, oder?

Kann es sein, dass du die DLL in etwa so lädst:

```
System.load( System.getProperty( "JAVA_HOME") + "\\JD2XX.dll");
```

Da du den Library-Path ja schon korrekt setzt, solltest du besser Syste.loadLibrary verwenden:

```
System.loadLibrary( "JD2XX"); //--- wichtig: ohne Extension '.dll'!!
```


----------



## ub007 (23. Mrz 2010)

Hallo !

Erstmal danke für die Antworten !
@Hans: Die JD2XX.dll wurde von Geisterhand über das Raum-Zeit-Kontinuum dort hin transkopiert. 
Spaß bei Seite. Ich arbeite ja an dem USB-Projekt und ich habe z.B. bei mir daheim nur im Management erstmal die jar-Files in Netbeans "angemeldet" und dann hies es die JD2XX.dll entweder ins jre/bin-Verzeichnis von Java oder in die system32. Nachdem ich Sie ins jre/bin Verzeichnis kopiert habe funktionierte alles wie gewünscht. O.K. jetzt kann man sich sicherlich streiten welches Verzeichnis das bessere ist, denke ich.
@Murray: Das geht auch über den System.loadLibrary( "JD2XX"); - Befehl nicht. Außerdem wird es dabei zur Laufzeit eingebunden und da habe ich gehört, dass sollte man event. vermeiden, aber das wäre mir dann auch egal. Nur jetzt bin ich mir nicht mehr ganz sicher ob es an der JD2XX liegt, denn mein Vorgänger hat noch die älteren Treiber drauf und die Verhalten sich anders wie es bei mir auf dem Rechner ist. Wenn ich das Ding bei mir daheim einstöppsle kommt die gewohnte Anmeldung wie bei Windows ...neue Hardware gefunden... Das macht der Rechner dort nicht. Das könnte vielleicht wirklich ein Hinweis sein, dass die Treiber nicht aktuell sind !
Ich werde es morgen mal ausprobieren und die alten runterschmeißen ! 
Vielen Dank erstmal - ich melde mich sobald ich es rausgefunden habe !

Gruß Uli


----------



## Marco13 (23. Mrz 2010)

Die Fehlermeldungen von loadLibrary sind manchmal etwas ... kryptisch .... (und natürlich abhängig vom Betriebssystem usw.). Aber "Die angegebene Prozedur wurde nicht gefunden" kommt GLAUBE ICH (!) wenn er zwar die DLL an sich findet, dort aber eine Methode drin sein sollte, die er nicht findet. Dort, oder in einer DLL, die von der angegebenen referenziert wird - das kommt noch erschwerend hinzu. Kannst ggf. mal an der Konsole
dumpbin /DEPENDENTS JD2XX.dll 
machen, da sollte man zumindest sehen, welche DLLs noch referenziert werden...


----------



## Murray (23. Mrz 2010)

ub007 hat gesagt.:


> Außerdem wird es dabei zur Laufzeit eingebunden


Wann soll das denn sonst passieren, wenn nicht zur Laufzeit?


----------



## ub007 (23. Mrz 2010)

Hallo !

Also so wie ich das verstanden habe kann man über NetBeans-Einstellungen die DLLs statisch einbinden.  Wenn es über den System.LoadLibrary geschieht dann wird es zur Laufzeit dynamisch eingebunden. 
Ob das jetzt stimmt kann ich nicht genau sagen, aber ich glaube das Marco13 hier recht hat. Wie gesagt ich bin erst morgen wieder im Geschäft und dann wird es sich rausstellen.

Gruß  Uli


----------



## Murray (23. Mrz 2010)

Egal, ob man die DLL per System.load oder System.loadLibrary lädt - das passiert natürlich erst dann ,wenn die entsprechende Anweisung ausgeführt wird (also zur Laufzeit). System.load erwartet allerdings den Namen der DLL, ggfs. mit Pfad, sofern die DLL nicht im Arbeitsverzeichnis der Anwendung. System.loadLibrary bekommt dagegen nur den Namen der Library, also auf keinen Fall den Pfad oder die Extension. Wie vom Namen der Library auf die zu ladende Datei geschlossen wird, ist betriebsystemabhängig - unter Windows wird eine DLL mit dem Namen der Library in der durch die Java-Property java.library.path bezeichneten Liste von Verzeichnissen gesucht.

Aber die konkrete Fehlermeldung deutet tatsächlich eher auf ein Konsitenzproblem hin - grundsätzlich wird die DLL wohl gefunden, aber entweder passt die Version nicht zum Java-Code, oder die DLL braucht andere DLLs die nicht oder in einer falschen Version gefunden werden.


----------



## ub007 (26. Mrz 2010)

Hallo !

Erstmal danke an alle !

Ich habs gefunden aber erst nach längerem hin und her, da nach dem suchen auf dem Rechner tausende ftd2xx.dll in vielen Verzeichnissen rumlag(ftd2xx.dll und JD2XX.dll gehören zusammen). So ist es halt wenn viele Leute auf einem Rechner arbeiten.
Die besagte ftd2xx.dll war die Version 2.0.0 und ich arbeitete daheim mit der aktuellen 2.0.6. 
Nach dem einspielen der neuen Treiber war alles in Butter und alles hat funktioniert !

Nochmals danke an alle.

    Gruß Uli


----------



## TDO88 (23. Mai 2018)

Hallo Zusammen,

ich habe ein ähnliches Problem.
Ich möchte eine DLL von einem Messgerät in meine Applikation integrieren.
Auf meinem PC (Win 10, 64-Bit) und NetBeans funktioniert alles wunderbar.
Jetzt habe ich das .jar File auf den Zielrechner kopiert (Win 7, 32-Bit) und versuche es zum laufen zu bringen.
Die DLL auf dem Zielrechner ist 32-Bit Version.
Scheinbar findet er die DLL, allerdings kann er die Prozeduren darin nicht finden (siehe Anhang)
Ich habe die DLL schon mit dem Dependency Walker durchsucht, aber die scheint sich wohl zu fühlen. Da sind keine auffälligen Fehler zu finden.
Hat jemand eine Idee, was ich noch ausprobieren könnte?!

Edit:
Achso, als Ergänzung:
Ich habe die DLL als public Interface FPS3010DLL extends Library eingebunden.
Die Methoden sind alle public und das ganze wird so aufgerufen:

int returnfunction;
IntByReference devCount = new IntByReference(-1);
String DLLPath = System.getProperty("user.dir")+ "\\fps3010.dll";
FPS3010INST = (FPS3010DLL) Native.loadLibrary(DLLPath, FPS3010DLL.class);

returnfunction = FPS3010INST.FPS_discover(1, devCount);

Gruß
TDO


----------



## TDO88 (4. Jun 2018)

Keiner eine Idee, woran es liegen könnte?


----------

