Mit einer HIDL-Schnittstellendatei generiert das Java-HIDL-Back-End Java-Schnittstellen.
Stub und Proxy-Code Unterstützt alle skalaren HIDL-Typen
([u
]int
{8,16,32,64}_t, float, double,
und
enum
s) sowie Strings, Interfaces, Safe Union-Typen, Struktur
sowie Arrays und Vektoren unterstützter HIDL-Typen. Das Java-HIDL-Back-End
unterstützt KEINE Union-Typen oder fmq-Typen. Android-Geräte
11 bietet Unterstützung für memory
und
handle
-Typen.
Da die Java-Laufzeit das Konzept
ohne Vorzeichen nicht unterstützt,
werden alle nicht signierten Typen (und darauf basierende Enums) als ihre
signierte Entsprechungen, d.h. aus uint32_t
wird ein int
in
der Java-Schnittstelle. Es wird keine Wertkonvertierung durchgeführt. die Implementierer auf der
Auf der Java-Seite müssen die signierten Werte so verwendet werden, als wären sie nicht signiert.
Aufzählungen
Enums generieren keine Java-enum-Klassen, sondern werden stattdessen in innere Klassen mit einer statischen Konstantendefinition für jeden enum-Fall. Wenn die Aufzählung -Klasse von einer anderen enum-Klasse ab, übernimmt sie den Speichertyp dieser Klasse. Aufzählungen, die auf einem vorzeichenlosen Ganzzahltyp basieren, werden in ihre Äquivalent zu vergleichen. Da der zugrunde liegende Typ ein primitiver Typ ist, wird der Standardwert für Felder/Variablen von Enum sind auch dann null, wenn kein Zähler mit Null vorhanden ist.
Beispiel: SomeBaseEnum
mit dem Typ
uint8_t
:
enum SomeBaseEnum : uint8_t { foo = 3 }; enum SomeEnum : SomeBaseEnum { quux = 33, goober = 127 };
... wird zu:
public final class SomeBaseEnum { public static final byte foo = 3; } public final class SomeEnum { public static final byte foo = 3; public static final byte quux = 33; public static final byte goober = 127; }
Und:
enum SomeEnum : uint8_t { FIRST_CASE = 10, SECOND_CASE = 192 };
... wird umformuliert als:
public final class SomeEnum { static public final byte FIRST_CASE = 10; // no change static public final byte SECOND_CASE = -64; }
Strings
String
in Java ist utf-8 oder utf-16, wird aber in utf-8 konvertiert
als gängiger HIDL-Typ verwendet. Außerdem: String
darf nicht null sein, wenn er an HIDL übergeben wird.
Alias und Arbeitsspeicher
Android 11 bietet Java-Unterstützung für handle
und
memory
-Typen. Sie werden in folgende Sprache übersetzt: android.os.NativeHandle
und
android.os.HidlMemory
. Ein Null-Handle wird als gültig angesehen, während ein Null-Handle
wie der Speicher nicht.
Im generierten Servercode sind nur empfangene Arbeitsspeicher- und Verarbeitungsargumente
im Bereich des Methodenaufrufs gültig ist. Wenn bei der Serverimplementierung die
Lifetime enthalten, müssen sie mit den jeweiligen dup()
-Methoden dupliziert werden. Die
Die zurückgegebene Instanz kann über den Methodenaufruf hinaus verwendet werden und sollte nach Abschluss des Vorgangs ordnungsgemäß geschlossen werden.
mit.
Im generierten Client-Code werden die Handles und Speicherinstanzen, die gesendet als Eingabeargumente der aufgerufenen Methode müssen weder dupliziert noch aufbewahrt werden. ist gültig, nachdem die Methode zurückgegeben wurde. Handles und Arbeitsspeicherinstanzen, empfangen, da Ausgabeargumente automatisch vom automatisch generierten Code und muss anschließend ordnungsgemäß geschlossen werden. Dies trifft zu, wenn diese die Argumente werden als Rückgabewerte der Methode angezeigt (im Fall eines einzelnen Rückgabewerts) oder mithilfe der Methode synchroner Callback-Stil, der bei mehreren Rückgabewerten verwendet wird.
Weitere Informationen zum Duplizieren und Schließen finden Sie in der Dokumentation der Java-Klassen.
Arrays und Vektoren
Arrays werden in Java-Arrays und Vektoren in
ArrayList<T>
, wobei T der entsprechende Objekttyp ist, möglicherweise
mit skalaren Typen wie vec<int32_t> =>
ArrayList<Integer>
). Hier einige Beispiele:
takeAnArray(int32_t[3] array); returnAVector() generates (vec<int32_t> result);
... wird zu:
void takeAnArray(int[] array); ArrayList<Integer> returnAVector();
Gebäude
Strukturen werden in Java-Klassen mit einem ähnlichen Layout übersetzt. Für Beispiel:
struct Bar { vec<bool> someBools; }; struct Foo { int32_t a; int8_t b; float[10] c; Bar d; };
... wird zu:
class Bar { public final ArrayList<Boolean> someBools = new ArrayList(); }; class Foo { public int a; public byte b; public final float[] c = new float[10]; public final Bar d = new Bar(); }
Deklarierte Typen
Jeder in types.hal
deklarierte Typ der obersten Ebene erhält eine eigene Java-Datei.
der Ausgabedatei (wie für Java erforderlich). Beispiel:
Bei der Datei types.hal
werden zwei zusätzliche Dateien erstellt (Foo.java).
und Bar.java):
struct Foo { ... }; struct Bar { ... struct Baz { }; ... };
Die Definition von Baz findet sich in einer statischen inneren Klasse von Bar (in Bar.java
).