Datum:
Angehängte Dateien:Hallo zusammen, ich versuche gerade, den Octopus (http://projekte.embedded-projects.net/index.php?mo...) 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
Exception in thread "main" java.lang.UnsatisfiedLinkError: octopusJNI.new_octopus_context()J at octopusJNI.new_octopus_context(Native Method) at octopus_context.<init>(octopus_context.java:55) 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/deta... EDIT: Der relevante Code ist:
System.loadLibrary("octopus"); // funktioniert
octopus_context oxo = new octopus_context(); // funktioniert nicht mehr
octopus.octopus_init(oxo);
octopus.octopus_open(oxo); |
Gruß & Dank, Michael
Datum:
Keine Antwort in 10 Tagen -- ist der Octopus wirklich so tot? Die Hardware finde ich eigentlich ganz nett...
Datum:
@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
Datum:
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! :-/
Datum:
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
Datum:
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.
Datum:
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
System.loadLibrary("octopus"); |
- Dann rufe ich die Methoden aus dem SWIG-Wrapper auf, z.B.
octopus_context oxo = new octopus_context(); |
- Das führt um eine Ecke zum Aufruf der Funktion in der DLL:
class octopusJNI {
[...]
public final static native long new_octopus_context();
[...]
}
|
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
Datum:
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
Datum:
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 ;-)
Datum:
Läubi .. schrieb: > Welche DLL? Der JavaWrapper? Der Java-Wrapper ist doch keine DLL, sondern besteht aus Java-Klassen, nämlich
octopus.java octopus_context.java octopus_device_list.java octopusConstants.java octopusJNI.java SWIGTYPE_p_unsigned_char.java SWIGTYPE_p_unsigned_int.java SWIGTYPE_p_usb_dev_handle.java 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
Datum:
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.
Datum:
> 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
Datum:
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.
Datum:
Ich hatte Benedikt Sauter vor 10 Tagen angeschrieben mit meiner ursprünglichen Frage, bisher keine Reaktion. Vielleicht ist er zur Zeit in Urlaub...
