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, i enum), jak również ciągi tekstowe, interfejsy, typy Safe_union, struct oraz 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; realizatora na stronie Strona Javy musi używać podpisanych wartości w taki sposób, jakby nie były one 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 obiektem podstawowym, domyślną wartością argumentu Pola/zmienne wyliczeniowe mają wartość 0, nawet jeśli nie ma zerowego elementu wyliczającego.

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

... zostanie przepisany w następujący sposób:

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 odebrane argumenty pamięci i nicka to tylko jest prawidłowa w zakresie wywołania metody. Jeśli implementacja serwera chce rozszerzyć od początku śledzenia, muszą zostać zduplikowane za pomocą ich metod dup(). zwróconej instancji można używać poza wywoływaniem metody i po zakończeniu powinna zostać prawidłowo zamknięta z naszymi usługami.

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. To prawda, że użytkownicy powracający argumenty są wyświetlane jako wartości zwracane przez metodę (w przypadku pojedynczych wartości zwracanych) lub użycie funkcji synchroniczny styl wywołania zwrotnego (używany w przypadku wielu zwracanych wartości).

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

Tablice i wektory

Tablice są przekształcane na tablice Java, a wektory – na ArrayList<T>, gdzie T to odpowiedni typ obiektu, być może zawijania typów skalarnych, takich jak vec<int32_t> => ArrayList<Integer>). Na 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;
};

... staje się:

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 Baza znajduje się w statycznej wewnętrznej klasie Bar (w Bar.java).