Typy danych

Biorąc pod uwagę plik interfejsu HIDL, backend Java HIDL generuje interfejsy Java, i kod serwera proxy. Obsługuje wszystkie skalarne typy HIDL ([u]int{8,16,32,64}_t, float, double,enums), a także ciągi znaków, interfejsy, typy safe_union, typy struct, tablice i wektory obsługiwanych typów HIDL. Backend języka Java HIDL NIE obsługuje typów związków ani typów Fmq. Android, 11 dodaje obsługę memory i handle typy.

Środowisko wykonawcze Java nie obsługuje natywnie koncepcji niepodpisanych liczb całkowitych, wszystkie typy niepodpisane (i wyliczenia oparte na nich) są traktowane dyskretnie jako podpisane odpowiedniki, np. uint32_t staje się int w interfejsu Java. Nie jest wykonywana żadna konwersja wartości. Implementator po stronie Java musi używać wartości podpisanych tak, jakby nie były podpisane.

Wykazy

Wyliczenia nie generują klas wyliczeniowych w Javie, ale są przekształcane na wewnętrzne klas zawierających definicję stałej statycznej dla każdego przypadku wyliczenia. Jeśli wyliczenie klasa pobiera z innej klasy wyliczeniowej, dziedziczy jej typ pamięci masowej. Wyliczenia oparte na bez znaku liczby całkowitej są zapisywane ponownie w znakach odpowiednik. Ponieważ typ bazowy jest prymitywny, wartość domyślna pól/zmiennych typu enum jest 0, nawet jeśli nie ma żadnego enumeratora zero.

Na przykład SomeBaseEnum o typie uint8_t:

enum SomeBaseEnum : uint8_t { foo = 3 };
enum SomeEnum : SomeBaseEnum {
    quux = 33,
    goober = 127
};

... staje się:

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;
}

Oraz:

enum SomeEnum : uint8_t {
    FIRST_CASE = 10,
    SECOND_CASE = 192
};

… jest zastępowane przez:

public final class SomeEnum {
    static public final byte FIRST_CASE  = 10;  // no change
    static public final byte SECOND_CASE = -64;
}

Strings

Kod String w Javie to utf-8 lub utf-16, ale jest konwertowany na utf-8 to typowy typ HIDL podczas przenoszenia. Dodatkowo: String nie może mieć wartości null po przekazaniu do HIDL.

Uchwyt i pamięć

Android 11 wprowadza obsługę Javy na platformach handle i memory typy. Są tłumaczone na android.os.NativeHandle i android.os.HidlMemory. Uchwyt o wartości null jest uznawany za prawidłowy, a wartość null Pamięć już nie.

W wygenerowanym kodzie serwera argumenty received memory i handle są ważne tylko w zakresie wywołania metody. Jeśli implementacja serwera chce rozszerzyć od początku śledzenia, muszą zostać zduplikowane za pomocą ich metod dup(). Zwrócona instancja może być używana poza wywołaniem metody i powinna zostać prawidłowo zamknięta po zakończeniu.

W wygenerowanym kodzie klienta uchwyty i instancje pamięci, które są wysłane jako argumenty wejściowe wywołanej metody nie muszą być duplikowane ani przechowywane ważne po zwróceniu metody. Jednak uchwyty i instancje pamięci, które są Odebrane, ponieważ argumenty wyjściowe są automatycznie duplikowane przez funkcję generowany automatycznie i musi zostać prawidłowo zamknięty po zakończeniu pracy. Dotyczy to zarówno sytuacji, gdy te argumenty zwracania występują jako wartości zwracane metody (w przypadku pojedynczej wartości zwracanej), jak i gdy są używane w ramach asynchronicznego stylu wywołania (w przypadku wielu wartości zwracanych).

Więcej informacji o duplikowaniu i zamykaniu znajdziesz w dokumentacji klas Java.

Tablice i wektory

Tablice są tłumaczone na tablice w języku Java, a wektory na ArrayList<T>, gdzie T jest odpowiednim typem obiektu, prawdopodobnie owijającym typy skalarne, takie jak vec<int32_t> => ArrayList<Integer>. Przykład:

takeAnArray(int32_t[3] array);
returnAVector() generates (vec<int32_t> result);

... staje się:

void takeAnArray(int[] array);
ArrayList<Integer> returnAVector();

Konstrukcje

Struktury są tłumaczone na klasy Java o podobnym układzie. Dla: przykład:

struct Bar {
 vec<bool> someBools;
};
struct Foo {
 int32_t a;
 int8_t b;
 float[10] c;
 Bar d;
};

… zmienia się w:

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();
}

Zadeklarowane typy

Każdy typ najwyższego poziomu zadeklarowany w types.hal otrzymuje własny plik .java (zgodnie z wymaganiami Java). Na przykład: Plik types.hal powoduje utworzenie 2 dodatkowych plików (Foo.java i Bar.java):

struct Foo {
 ...
};

struct Bar {
 ...

 struct Baz {
 };

 ...
};

Definicja Baz znajduje się w statycznej klasie wewnętrznej Bar (w Bar.java).