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


von Michael G. (mjgraf)


Angehängte Dateien:

Lesenswert?

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
4
octopus.octopus_init(oxo);
5
octopus.octopus_open(oxo);

Gruß & Dank,
Michael

: Verschoben durch Moderator
von Michael G. (mjgraf)


Lesenswert?

Keine Antwort in 10 Tagen -- ist der Octopus wirklich so tot? Die 
Hardware finde ich eigentlich ganz nett...

von Sigint 112 (sigint)


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

von Michael G. (mjgraf)


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! :-/

von Sigint 112 (sigint)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Michael G. (mjgraf)


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
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

von Michael G. (mjgraf)


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

von Läubi .. (laeubi) Benutzerseite


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 ;-)

von Michael G. (mjgraf)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


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.

von Michael G. (mjgraf)


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

von Läubi .. (laeubi) Benutzerseite


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.

von Michael G. (mjgraf)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.