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
s), 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
).