www.mikrocontroller.net

Forum: PC-Programmierung octopus.dll (und Java?)


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Michael Graf (mjgraf)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Michael Graf (mjgraf)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Keine Antwort in 10 Tagen -- ist der Octopus wirklich so tot? Die 
Hardware finde ich eigentlich ganz nett...

Autor: Sigint 112 (sigint)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
@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

Autor: Michael Graf (mjgraf)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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! :-/

Autor: Sigint 112 (sigint)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Michael Graf (mjgraf)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Michael Graf (mjgraf)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Läubi .. (laeubi) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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 ;-)

Autor: Michael Graf (mjgraf)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: Läubi .. (laeubi) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Michael Graf (mjgraf)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
> 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

Autor: Läubi .. (laeubi) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Michael Graf (mjgraf)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich hatte Benedikt Sauter vor 10 Tagen angeschrieben mit meiner 
ursprünglichen Frage, bisher keine Reaktion. Vielleicht ist er zur Zeit 
in Urlaub...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net