# cxxwrap und JNI Schnittstelle



## vladimir (18. Mai 2009)

Hallo liebe Leute,

Ich entwickele unter Linux und würde gern das ganze mit Java machen.
Meine Aufgabe ist es über einen CAN-Protokoll einen Motor anzusteuern. Die nötige Hardware habe ich mir besorgt CANUSB - The Low cost CAN to USB converter. Dazu gab es auch einen Linux Treiber der ebenfalls funktioniert (in C getestet). Normalerweise kann man die Headerfiles von dem Treiber wrappen und direkt auf die Funktionen über native Funktionsaufrufe zugreifen.
Ich habe Probleme mit dem wrappen von einer C Headersfiles in eine Native Java Klasse. Als Wrapper benutze ich den cxxwrap. Wenn ich eine einfachen C-Header wrappe geht es wunderbar. Beim Versuch die Headers von dem Treiber zu wrappen funktioniert das ganze nicht mehr, ich bekomme leider auch keine Fehlermeldungen.

Consolenausgabe:
root@root-ubuntu:~/Downloads/cxxwrap-20061217$ ./cxxwrap --jni ftd2xx.h 
scanned 1 header file.

generated 0 class definitions.

Summary: .


Ich hoffe jemand kann mir da helfen,

Gruß Vladimir


----------



## vladimir (18. Mai 2009)

Hallo nochmals habe mein Problem selbst gelöst. cxxwrap kann nur C++ Header wrappen.
Um C Header zu wrappen muss man unter Linux SWIG benutzen. SWIG braucht eine Datei die  ihm sagt welche Header er zu wrappen hat. 

(Dateibeispiel
/* File: convert.i */
%module convert
%{
#include "ftd2xx.h"
#include "WinTypes.h"
%}

%include "ftd2xx.h"
%include "WinTypes.h"

danach einfach in der Konsole 
	swig -java convert.i 
eintipern, wuala hat das Tool für uns eine komplette native Bibliothek für die Benutzung über JNI erstellt.

Hoffe das das einer gebrauchen kann!

Gruß Vladimir


----------



## vladimir (18. Mai 2009)

Sorry Leute muss noch mal posten,

mit dem einfachen SWIG geht das wrappen wunderbar. Leider entstehen Konvertierungsfehler beim Parsen, die Nativen Klassen werden dadurch unbrauchbar.
Der SWIG-1.3 ist da viel besser und ausgewogener, die Datentypen werden konsistent behandelt und  passend umgewandelt. Die Wrapperklassen können vernünftig eingesetzt werden.

Falls ich noch was raus finden sollte, werde ich nochmal posten.
Schließlich ist dies ein praxisnahes Thema!

Gruß Vladimir


----------



## Wildcard (18. Mai 2009)

Schau dir vielleicht mal JNA an.


----------



## tuxedo (19. Mai 2009)

--> http://jna.dev.java.net

Hab damit auch schon gearbeitet. Allerdings gibts auch da die eine oder andere Falltüre. Konnte aber bisher 98% der zu wrappenden Methoden/Libraries problemlos wrappen.

- Alex


----------



## vladimir (21. Mai 2009)

Danke euch beiden für die Tips, ich glaube das ist genau das richtige für mich.
Einige Schwirigkeiten habe ich dennoch, in C kann man Zeiger und Strukturen übergeben. 
Wie ich dies in JNA mache habe ich keine Ahnung:
Ein Beispiel aus dem Header:

//Definitionen:
typedef DWORD		 	*FT_HANDLE;

typedef ULONG			 FT_STATUS;

Funktionen:

FTD2XX_API
FT_STATUS WINAPI FT_Open(int deviceNumber, FT_HANDLE *pHandle);

FTD2XX_API
FT_STATUS WINAPI FT_OpenEx(PVOID pArg1, DWORD Flags, FT_HANDLE *pHandle);

Wie soll ich unter umständen so eine Funktion aufrufen? Unter JNI wird für eine Definition oder Struktur eine Komplette Klasse angelegt. Mussman bei JNA kommplet den Header nachbilden?


----------



## vladimir (26. Okt 2009)

Hab eine fertige Bibliothek für mein Problem gefunden! Eine kommplete Umsetzung des FTDI Treibers der bei dem Konverter benutzt werden kann! Für alle interesenten die Bibliothek ist von Mike Werner: FTD2xxj | Get FTD2xxj at SourceForge.net


----------



## max k (3. Nov 2011)

Hallo

tut mir leid, dass ich dieses thema nocheinmal aufwärmen muss, aber genau zu der oben denannten Bibliothek habe ich eine frage (FT2xxj)

Wie bzw. welche Dateien genau muss ich einbinden um diese Klassen benutzen zu können. Ich arbeite unter eclipse.

Lg


----------



## vladimir (7. Nov 2011)

Es war schon etwas länger her aber das ist eigentlich nicht weiter schwer. Du musst bei Windows die ft2xx.dll runterladen und einbinden (bei Linux die ft2xx.o). In Eclipse oder Netbeans das Jar ganz normal als eine Bibliothek einbinden und benutzen. Es gab ein paar Beispiele dazu. Hier der Link, dies funktioniert auf jeden Fall ist von mir zig male benutzt worden… Dort findest Du auch eine andere Bibliothek JD2XX die kann man auch nehmen geht auch sehr einfach. Ist änlich.


----------

