java native access, probleme mit zugriff auf array

p0llux

Grünschnabel
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:
USHORT WINAPI RC_ReadCalibrationValue( HANDLE DeviceHandle, double *DataArray);

ausschnitt aus rcu1a.java

Code:
short RC_ReadCalibrationValue(Pointer DeviceHandle, DoubleByReference DataArray);

und aus der zugehörigen zugriffsklasse spectrometer.java

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

java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=8, offset=48

Wenn ich stattdessen calibData.getValue() eingebe, erhalte ich den Wert, der im ersten Feld des Arrays stehen sollte.

Was mache ich falsch, bzw. was sollte ich ändern?

Danke für eure Antworten!
 
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:
Java:
short RC_ReadCalibrationValue(Pointer deviceHandle, double[] dataArray);
Ü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.

Gruß
miffi

BTW: Java-Variablen sollte man klein schreiben.
 
Zuletzt bearbeitet:
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 ;)
 
Zurück