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