JNA getFieldOrder() Bedeutung

Der_AltMann

Aktives Mitglied
Ich habe nicht ganz verstanden, was die Methode bringt. Außerdem verstehe ich nicht ganz, wie Structs in der Methode behandelt werden müssen.
Vielen Dank schonmal :)
 
K

kneitzel

Gast
In C gibt es structs. Wenn Du einb C (oder c++) struct nutzen willst, dann brauchst Du ein Gegenpart. In der JNA Library dient dazu die Klasse Structure (com.sun.jna) und zu dieser Klasse gehört die (früher abstrakte) Methode getFieldOrder(), welche eine Liste der Felder der struct zurück gibt.

Das ist deshalb wichtig, da die Auflistung der Felder, welche in einer Klasse vorhanden sind, bei der Abfrage über getClass().getFields() nicht fest ist:
Field order must be explicitly indicated, since the field order as returned by Class.getFields() is not guaranteed to be predictable.

Somit ist das keine Methode, die ein struct irgendwie behandelt sondern in JNA wird eine von Structure abgeleitete Klasse verwendet, um als Gegenpart zum c/c++ struct zu dienen. Und die Methode dient dazu, die Felder und ihre richtige Reihenfolge zu definieren.

Btw: Statt die Methode getFieldOrder zu überschreiben kann man auch die @FieldOrder Annotation nutzen. (http://java-native-access.github.io/jna/5.6.0/javadoc/com/sun/jna/Structure.FieldOrder.html)

Siehe dazu auch: http://java-native-access.github.io/jna/5.6.0/javadoc/overview-summary.html (Wobei da das Minimal-Beispiel gekürzt zu sein scheint, denn das Point Beispiel hat weder die Annotation noch überschreibt es die Methode...)
 

Der_AltMann

Aktives Mitglied
In C gibt es structs. Wenn Du einb C (oder c++) struct nutzen willst, dann brauchst Du ein Gegenpart. In der JNA Library dient dazu die Klasse Structure (com.sun.jna) und zu dieser Klasse gehört die (früher abstrakte) Methode getFieldOrder(), welche eine Liste der Felder der struct zurück gibt.

Das ist deshalb wichtig, da die Auflistung der Felder, welche in einer Klasse vorhanden sind, bei der Abfrage über getClass().getFields() nicht fest ist:


Somit ist das keine Methode, die ein struct irgendwie behandelt sondern in JNA wird eine von Structure abgeleitete Klasse verwendet, um als Gegenpart zum c/c++ struct zu dienen. Und die Methode dient dazu, die Felder und ihre richtige Reihenfolge zu definieren.

Btw: Statt die Methode getFieldOrder zu überschreiben kann man auch die @FieldOrder Annotation nutzen. (http://java-native-access.github.io/jna/5.6.0/javadoc/com/sun/jna/Structure.FieldOrder.html)

Siehe dazu auch: http://java-native-access.github.io/jna/5.6.0/javadoc/overview-summary.html (Wobei da das Minimal-Beispiel gekürzt zu sein scheint, denn das Point Beispiel hat weder die Annotation noch überschreibt es die Methode...)
Vielen Dank das hilft mir auf jeden Fall weiter! :)

Ich hatte paar Mal das Problem, dass in einem Struct ein weiteres Struct vorhanden war, oder ein Array mit Structs drin. Als ich dann dieses Struct in die Fieldlist übernehmen wollte habe ich immer den Fehler bekommen:
Structure.getFieldOrder() on class DriverConfig provides too many names [4] ... to match declared fields [3]

Muss man die Structs da irgendwie anders aufnehmen?
 
K

kneitzel

Gast
Wie hast du denn die Felder aufgeführt? Wenn du ein Beispiel bei gst, dann kann man das Problem bestimmt lösen.

Hast du evtl. eine Liste mit allen Elementen erstellt?
Nach meinem Verständnis derzeit ist der Typ ja egal. Du nennst nur die Felder und gut ist es. Wenn ein Feld im struct wieder ein Structure ist, dann ist es halt so. Die Felder dieser Structure führst du nicht im übergeordneten Structure auf.
 
K

kneitzel

Gast
Schau doch einfach einmal in die Dokumentation:

Da findet sich dann:
"Unions do not need a field order, so automatically provide a value to satisfy checking in the Structure superclass."
 

Ähnliche Java Themen

Neue Themen


Oben