Datentypen

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 enums) 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).