ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
305
305
EMPFEHLEN
-
ch habe ine c-dll für den Zugfriff auf ein Spektrometer. Da ich es in JAVA verwenden will, habe ich eine Klasse mit JNA geschrieben.
Ich kann über USB auf das Spektrometer zugreifen und Werte auslesen, setzen. Heisst grundsätzlich funktioniert der Zugriff. Funktionen die in Struct-Pointer (JAVA Structures) schreiben funktionieren auch.
Ich habe aber Probleme mit Funktionen, die Pointer auf Type als Argument nehmen, um ein Array zurückzugeben.
Zum Beispiel:
in rcu1a.h
Code :1
USHORT WINAPI RC_ReadCalibrationValue( HANDLE DeviceHandle, double *DataArray);
ausschnitt aus rcu1a.java
Code :1
short RC_ReadCalibrationValue(Pointer DeviceHandle, DoubleByReference DataArray);
und aus der zugehörigen zugriffsklasse spectrometer.java
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//load library private rcu1a lib = (rcu1a) Native.loadLibrary("rcu1a", rcu1a.class); //... private DoubleByReference calibData = new DoubleByReference(); //... public double [] calibrationData() { lib.RC_ReadCalibrationValue(DeviceHandle, calibData); return calibData.getPointer.getDoubleArray(0,6); }
Die Methode sollte ein Double-Array mit 6 Feldern zurückgeben, allerdings erhalte ich einen Error:
Wenn ich stattdessen calibData.getValue() eingebe, erhalte ich den Wert, der im ersten Feld des Arrays stehen sollte.java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=8, offset=48
Was mache ich falsch, bzw. was sollte ich ändern?
Danke für eure Antworten!
-
21.09.11 00:44 #2
- Registriert seit
- Jun 2009
- Beiträge
- 870
vielleicht sind die nativen doubles kleiner als die Java-doubles?
probier es mal mit Float im Java-Code.Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
danke...hat leider nicht geklappt. ist es denn grundsätzlich richtig, wie ich auf das array zugreifen will?
-
dein Problem ist doch nur das du ein array erwartest welches nicht die größe hat die du bekommst!
Versuch mal die Größe anzupassen oder einen allgemeinen zugriff auf das array zu bekommen. wie zum beispiel mit getvalue und co
-
Howdie.
Änder mal den zweiten Parameter in ein Double-Array:
Übergib dann ein Array mit 6 allokierten Stellen. Wenn du für solche verketteten Parameter Arrays bei JNA-calls benutzt, kannst du den Umweg über Pointer vermeiden. So oder so musst du sicher sein (wie genodeftest bereits gesagt hat), dass die Doubles gleich groß sind. In C/C++ wird das ja gern flexibel (projekt- bzw. plattform-spezifisch) definiert.Code java:1
short RC_ReadCalibrationValue(Pointer deviceHandle, double[] dataArray);
Gruß
miffi
BTW: Java-Variablen sollte man klein schreiben.Geändert von miffi (30.09.11 um 14:28 Uhr)
"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
-
Danke für eure Antworten, ich werde das mit dem double-Array mal probieren.
Ich habe nun eine wrapper-dll geschrieben, die das array als komma getrennten string übergibt. nicht die eleganteste lösung aber im moment funktionierts
Ich habe die Variabeln gross geschrieben, um mit der dll konsistent zu sein, und diese stammt nicht von mir
Ähnliche Themen
-
Java Native Interface
Von Technoblade im Forum C/C++Antworten: 8Letzter Beitrag: 20.06.11, 00:06 -
Java native Interface
Von Technoblade im Forum JavaAntworten: 9Letzter Beitrag: 22.04.11, 08:51 -
Java Native Interface
Von SKORP79 im Forum JavaAntworten: 10Letzter Beitrag: 31.10.05, 14:56 -
MS-Access: Probleme bei Zugriff mehrere Benutzer gleichzeitig!
Von Vespia im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 22.12.04, 09:28





Zitieren
Login





