Hallo zusammen,
ich versuche gerade, den Octopus
(http://projekte.embedded-projects.net/index.php?module=content&action=show&page=octopus)
unter Windows und Java zum Laufen zu bekommen. libusb ist installiert
und funktioniert; ich sehe den Octopus als USB-Gerät in der
Systemsteuerung. Auch die demo.exe aus octopususb-0.5\demos\c\
funktioniert.
Wenn ich aber versuche, den Code aus
octopususb-0.5\demos\java\example.java auszuführen, erhalte ich jedoch
immer die Meldung
1
Exception in thread "main" java.lang.UnsatisfiedLinkError: octopusJNI.new_octopus_context()J
2
at octopusJNI.new_octopus_context(Native Method)
3
at octopus_context.<init>(octopus_context.java:55)
4
at Start.main(Start.java:17)
(Start.java, weil ich den relevanten Code in meine eigene .java kopiert
habe.)
Die octopus.dll wird gefunden, die Funktion new_octopus_context() darin
jedoch nicht. Nach einigem Suchen habe ich mal mit dem Dependency Walker
in die .dll hineingeschaut, und war arg überrascht -- denn der findet
die Funktion auch nicht, und es scheinen auch einige andere Funktionen
zu fehlen, u.a. die SPI- und I2C-Funktionen (s. Anhang).
Übersehe ich hier etwas, oder fehlen in der .dll wirklich Funktionen? Im
C-Quelltext sind sie vorhanden, ich habe jedoch unter Windows keinen
C-Compiler zur Verfügung, um die .dll neu zu übersetzen.
Verwendet wurden
- Windows 7 professional
- JRE 1.7 (Fehler ist aber auch mit JRE 1.6 und 1.4 reproduzierbar)
- octopus.dll aus
http://code.google.com/p/octopususb/downloads/detail?name=octopususb-0.5.tar.gz&can=2&q=
EDIT: Der relevante Code ist:
1
System.loadLibrary("octopus"); // funktioniert
2
3
octopus_context oxo = new octopus_context(); // funktioniert nicht mehr
@Michael:
Ich kenn mich mit Java nicht so gut aus, aber du kannst die Funktionen
nicht in der DLL finden, da sie nicht existieren. Es wird ein Wrapper
genutzt, um die DLL zu nutzen. (http://www.swig.org/)
Der liegt im Verzeichniss /libs/java.
Im Makefile gibts aber nur einen Eintrag für Linux, nicht für Windows.
Also musst du dir wahrscheinlich selbst nen Wrapper basteln. Keine
Ahnung, wie das unter Java geht.
Gruß,
SIGINT
Danke, SIGINT!
Verstehe ich richtig, dass demnach
(a) die Windows-DLL und die die Linux-Lib unterschiedliche Funktionen
unterstützen, wobei der Windows-DLL Funktionen fehlen (u.a. SPI,
I2C-Unterstützung), und
(b) ich deshalb für Windows und Linux unterschiedliche Java-Wrapper
brauche?
Super! :-/
Ich kann verstehen, warum das Teil nicht so weit verbreitet ist. Die
Doku ist totaler Mist, da fehlt ja die Hälfte. Am besten Fragst du mal
im Forum von SWIG nach, wie man den Wrapper unter Java nutzt. Ich glaube
mittlerweile, daß die DLL irgendwie in Java eingebunden werden muss,
damit du die nutzen kannst. Den Octopus-Treiber hast du auch
installiert, oder?
In C ist alles viel einfacher: Einfach ne Import-Lib basteln und gut
ist.
Gruß,
SIGINT
Michael Graf schrieb:> Keine Antwort in 10 Tagen -- ist der Octopus wirklich so tot? Die> Hardware finde ich eigentlich ganz nett...
Vielleicht liegt's ja auch einfach am falschen Forum?
Ich schieb' das mal in die PC-Programmierung, denn dein Problem
liegt ja auf jeden Fall in diesem Bereich.
Sigint 112 schrieb:> Ich kann verstehen, warum das Teil nicht so weit verbreitet ist. Die> Doku ist totaler Mist,
Jepp. Habe ich leider erst reingeschaut, als das Teil schon zu Hause
lag...
> da fehlt ja die Hälfte. Am besten Fragst du mal> im Forum von SWIG nach, wie man den Wrapper unter Java nutzt. Ich glaube> mittlerweile, daß die DLL irgendwie in Java eingebunden werden muss,> damit du die nutzen kannst.
Das ist mir schon klar (denke ich...):
- Die DLL lade ich mit
1
System.loadLibrary("octopus");
- Dann rufe ich die Methoden aus dem SWIG-Wrapper auf, z.B.
1
octopus_context oxo = new octopus_context();
- Das führt um eine Ecke zum Aufruf der Funktion in der DLL:
1
class octopusJNI {
2
[...]
3
public final static native long new_octopus_context();
4
[...]
5
}
Blöderweise gibt es in der DLL aber kein new_octopus_context(), wenn ich
den Output des Dependency Walker richtig lese. (Lese ich ihn richtig?)
Das führt mich zum Verdacht, dass
- die DLL und die Unix-lib einen unterschiedlichen Funktionsumfang
haben, und
- der Wrapper für die Unix-lib generiert wurde.
Soll-Zustand sollte doch eigentlich sein, dass
- DLL und Unix-lib die gleichen Funktionen enthalten,
- dadurch der SWIG-Wrapper für beide passt, und
- so die Plattform-Unabhängigkeit auf JAVA-Seite gewahrt ist.
Oder nicht?
> Den Octopus-Treiber hast du auch> installiert, oder?> In C ist alles viel einfacher: Einfach ne Import-Lib basteln und gut> ist.
Hilft aber auch nicht, wenn der Bibliothek auf einer der Plattformen
Funktionen fehlen...
Gruß & Dank,
Michael
Jörg Wunsch schrieb:> Vielleicht liegt's ja auch einfach am falschen Forum?>> Ich schieb' das mal in die PC-Programmierung, denn dein Problem> liegt ja auf jeden Fall in diesem Bereich.
Ich hatte eigentlich vermutet, die Octopus-User im µC-Forum zu finden.
Wenn's hier besser passt: Danke!
Gruß,
Michael
Michael Graf schrieb:> Blöderweise gibt es in der DLL aber kein new_octopus_context(),> wenn ich den Output des Dependency Walker richtig lese.
Welche DLL? Der JavaWrapper? Es gibt zwei DLLs mit gleichem Namen, also
vorsicht!
octopus_context ist eine reine Javaklasse siehe: octopus_context.java
unter /libs/java dort müßte auch die "richtige" octupus.dll liegen.
Sigint 112 schrieb:> In C ist alles viel einfacher: Einfach ne Import-Lib basteln und> gut ist.
Ist in Java auch einfach man muss es nur richtig nutzen ;-)
Läubi .. schrieb:> Welche DLL? Der JavaWrapper?
Der Java-Wrapper ist doch keine DLL, sondern besteht aus Java-Klassen,
nämlich
1
octopus.java
2
octopus_context.java
3
octopus_device_list.java
4
octopusConstants.java
5
octopusJNI.java
6
SWIGTYPE_p_unsigned_char.java
7
SWIGTYPE_p_unsigned_int.java
8
SWIGTYPE_p_usb_dev_handle.java
9
SWIGTYPE_p_usb_device.java
und den zugehörigen .class-Dateien. Die liegen alle in
octopususb-0.5\libs\java\.
> Es gibt zwei DLLs mit gleichem Namen, also vorsicht!
Welche denn? Die octopususb-0.5 enthält zwar zweimal die octopus.dll (in
libs\java und liboctopus\src), aber die sind Byte für Byte identisch.
> octopus_context ist eine reine Javaklasse siehe: octopus_context.java> unter /libs/java dort müßte auch die "richtige" octupus.dll liegen.
Soweit ist mir das klar...
Gruß & Dank,
Michael
Michael Graf schrieb:> Der Java-Wrapper ist doch keine DLL, sondern besteht aus Java-Klassen
Nein, der Javawrapper besteht aus octopusJNI.java und
liboctopus.so/octopus.dll der Rest ist nur drumherum und sollte reiner
Java Code sein.
Michael Graf schrieb:> Welche denn? Die octopususb-0.5 enthält zwar zweimal die octopus.dll (in> libs\java und liboctopus\src), aber die sind Byte für Byte identisch.
Das ist natürlich etwas merkwürdig aber ich kenne das SWYX auch nicht so
genau, hast du den mal versucht die Lib von Grund auf auf deinem System
zu kompilieren? Ich habe leider gerade keine Windows Toolchain um es
auszuprobieren.
> Ich habe leider gerade keine Windows Toolchain um es auszuprobieren.
Ich leider auch nicht -- PC-Programmierung mache ich eigentlich nur in
Java und Perl, weil das Ergebnis dann auf allen hier herumstehenden
Plattformen (OS X, Windows XP, Windows 7) tut.
Die Idee beim Octopus-Kauf (und der dort beworbenen Java-Fähigkeiten)
war, dass das auch so bleiben kann...
Gruß & Dank,
Michael
Naja der angebotene
Michael Graf schrieb:> Die Idee beim Octopus-Kauf (und der dort beworbenen Java-Fähigkeiten)> war, dass das auch so bleiben kann...
Schreib doch mal an den Shop ob die es mit Java+Windows getestet haben,
ansonsten ist mit MinGW auch recht schnell eine Toolchain installiert.