Dengan file antarmuka HIDL, backend Java HIDL akan menghasilkan antarmuka Java,
Stub, dan kode Proxy. API ini mendukung semua jenis HIDL skalar
([u
]int
{8,16,32,64}_t, float, double,
dan
enum
), serta string, antarmuka, jenis safe_union, jenis
struct, serta array dan vektor dari jenis HIDL yang didukung. Backend Java HIDL
TIDAK mendukung jenis union atau jenis fmq. Android
11 menambahkan dukungan untuk jenis memory
dan
handle
.
Karena runtime Java tidak mendukung konsep bilangan bulat tanpa tanda tangan secara native,
semua jenis tanpa tanda tangan (dan enum berdasarkan jenis tersebut) diperlakukan secara diam-diam sebagai
ekuivalent bertanda tangan, yaitu uint32_t
menjadi int
di
antarmuka Java. Tidak ada konversi nilai yang dilakukan; implementor di
sisi Java harus menggunakan nilai yang ditandatangani seolah-olah tidak ditandatangani.
Enum
Enum tidak menghasilkan class enum Java, tetapi diterjemahkan ke dalam class internal yang berisi definisi konstanta statis untuk setiap kasus enum. Jika class enum berasal dari beberapa class enum lainnya, class tersebut akan mewarisi jenis penyimpanan class tersebut. Enumerasi berdasarkan jenis bilangan bulat tanpa tanda tangan ditulis ulang menjadi yang setara dengan tanda tangan. Karena jenis dasarnya adalah primitif, nilai default untuk kolom/variabel enum adalah nol meskipun tidak ada penghitung nol.
Misalnya, SomeBaseEnum
dengan jenis
uint8_t
:
enum SomeBaseEnum : uint8_t { foo = 3 }; enum SomeEnum : SomeBaseEnum { quux = 33, goober = 127 };
… menjadi:
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; }
Dan:
enum SomeEnum : uint8_t { FIRST_CASE = 10, SECOND_CASE = 192 };
… ditulis ulang sebagai:
public final class SomeEnum { static public final byte FIRST_CASE = 10; // no change static public final byte SECOND_CASE = -64; }
String
String
di Java adalah utf-8 atau utf-16, tetapi dikonversi menjadi utf-8
sebagai jenis HIDL umum saat ditranspor. Selain itu, String
tidak boleh null saat diteruskan ke HIDL.
Pegangan dan memori
Android 11 memperkenalkan dukungan Java untuk jenis handle
dan
memory
. Keduanya diterjemahkan menjadi android.os.NativeHandle
dan
android.os.HidlMemory
. Handle null dianggap valid, sedangkan memori
null tidak.
Dalam kode server yang dihasilkan, argumen memori dan penanganan yang diterima hanya
valid dalam cakupan pemanggilan metode. Jika implementasi server ingin memperpanjang
masa aktifnya, implementasi tersebut harus diduplikasi menggunakan metode dup()
masing-masing. Instance
yang ditampilkan dapat digunakan di luar pemanggilan metode dan harus ditutup dengan benar saat selesai
digunakan.
Dalam kode klien yang dihasilkan, instance handle dan memori yang dikirim sebagai argumen input metode yang dipanggil tidak perlu diduplikasi atau disimpan valid setelah metode ditampilkan. Namun, instance handle dan memori yang diterima sebagai argumen output akan otomatis diduplikasi oleh kode yang dibuat otomatis dan harus ditutup dengan benar setelah selesai. Hal ini berlaku baik argumen kembali tersebut muncul sebagai nilai kembali metode (dalam kasus nilai kembali tunggal) atau menggunakan gaya callback sinkron (digunakan dalam kasus nilai kembali ganda).
Untuk informasi selengkapnya tentang duplikasi dan penutupan, lihat dokumentasi class Java.
Array dan vektor
Array diterjemahkan menjadi array Java dan vektor diterjemahkan menjadi
ArrayList<T>
dengan T adalah jenis objek yang sesuai, mungkin
menggabungkan jenis skalar seperti vec<int32_t> =>
ArrayList<Integer>
). Misalnya:
takeAnArray(int32_t[3] array); returnAVector() generates (vec<int32_t> result);
… menjadi:
void takeAnArray(int[] array); ArrayList<Integer> returnAVector();
Struktur
Struktur diterjemahkan ke dalam class Java dengan tata letak yang serupa. Contoh:
struct Bar { vec<bool> someBools; }; struct Foo { int32_t a; int8_t b; float[10] c; Bar d; };
… menjadi:
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(); }
Jenis yang dideklarasikan
Setiap jenis level teratas yang dideklarasikan di types.hal
mendapatkan file output .java-nya sendiri (seperti yang diperlukan oleh Java). Misalnya, file
types.hal
berikut menghasilkan dua file tambahan yang dibuat (Foo.java
dan Bar.java):
struct Foo { ... }; struct Bar { ... struct Baz { }; ... };
Definisi Baz berada di class dalam statis Bar (di Bar.java
).