tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
305
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    p0llux p0llux ist offline Grünschnabel
    Registriert seit
    Sep 2011
    Beiträge
    3
    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:

    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!
     

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    p0llux p0llux ist offline Grünschnabel
    Registriert seit
    Sep 2011
    Beiträge
    3
    danke...hat leider nicht geklappt. ist es denn grundsätzlich richtig, wie ich auf das array zugreifen will?
     

  4. #4
    wakoz wakoz ist offline Mitglied Gold
    Registriert seit
    Apr 2010
    Beiträge
    114
    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
     

  5. #5
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Howdie.

    Änder mal den zweiten Parameter in ein Double-Array:
    Code java:
    1
    
    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.
    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

  6. #6
    p0llux p0llux ist offline Grünschnabel
    Registriert seit
    Sep 2011
    Beiträge
    3
    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

  1. Java Native Interface
    Von Technoblade im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 20.06.11, 00:06
  2. Java native Interface
    Von Technoblade im Forum Java
    Antworten: 9
    Letzter Beitrag: 22.04.11, 08:51
  3. Java Native Interface
    Von SKORP79 im Forum Java
    Antworten: 10
    Letzter Beitrag: 31.10.05, 14:56
  4. MS-Access: Probleme bei Zugriff mehrere Benutzer gleichzeitig!
    Von Vespia im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 22.12.04, 09:28