Dengan file antarmuka HIDL, backend HIDL Java menghasilkan antarmuka Java, Stub, dan kode Proxy. Backend ini mendukung semua jenis HIDL skalar
([u]int{8,16,32,64}_t, float, double, dan
enums), serta string, antarmuka, jenis safe_union, jenis struct
types, dan array serta vektor jenis HIDL yang didukung. Backend HIDL Java TIDAK mendukung jenis union atau jenis fmq. Android 11 menambahkan dukungan untuk jenis memory dan handle.
Karena runtime Java tidak mendukung konsep bilangan bulat yang tidak bertanda tangan secara native,
semua jenis yang tidak bertanda tangan (dan enum berdasarkan jenis tersebut) secara diam-diam diperlakukan sebagai jenis yang
bertanda tangan, yaitu uint32_t menjadi int di
antarmuka Java. Tidak ada konversi nilai yang dilakukan; implementor di sisi Java harus menggunakan nilai yang bertanda tangan seolah-olah tidak bertanda tangan.
Enum
Enum tidak menghasilkan class enum Java, tetapi diterjemahkan ke dalam class dalam yang berisi definisi konstanta statis untuk setiap kasus enum. Jika class enum berasal dari class enum lain, class tersebut akan mewarisi jenis penyimpanan class tersebut. Enumerasi berdasarkan jenis bilangan bulat yang tidak bertanda tangan ditulis ulang menjadi jenis yang bertanda tangan. Karena jenis yang mendasarinya adalah primitif, nilai default untuk kolom/variabel enum adalah nol meskipun tidak ada enumerator 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 ke utf-8 sebagai jenis HIDL umum saat ditransmisikan. Selain itu, String tidak boleh null saat diteruskan ke HIDL.
Handle dan memori
Android 11 memperkenalkan dukungan Java untuk jenis handle dan
memory. Jenis tersebut masing-masing diterjemahkan ke dalam android.os.NativeHandle dan
android.os.HidlMemory. Handle null dianggap valid, sedangkan memori null
tidak.
Dalam kode server yang dihasilkan, argumen memori dan handle 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 setelah selesai
dengan.
Dalam kode klien yang dihasilkan, instance handle dan memori yang dikirim sebagai argumen input metode yang dipanggil tidak perlu diduplikasi atau tetap valid setelah metode ditampilkan. Namun, instance handle dan memori yang diterima sebagai argumen output otomatis diduplikasi oleh kode yang dibuat otomatis dan harus ditutup dengan benar setelah selesai. Hal ini berlaku baik argumen yang ditampilkan muncul sebagai nilai yang ditampilkan dari metode (dalam kasus nilai yang ditampilkan tunggal) atau menggunakan gaya callback sinkron (digunakan dalam kasus nilai yang ditampilkan ganda).
Untuk mengetahui informasi selengkapnya tentang duplikasi dan penutupan, lihat dokumentasi class Java.
Array dan vektor
Array diterjemahkan ke dalam array Java dan vektor diterjemahkan ke dalam
ArrayList<T> dengan T adalah jenis objek yang sesuai, yang mungkin
menggabungkan jenis skalar seperti vec<int32_t> =>
ArrayList<Integer>). Contoh:
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 tingkat atas yang dideklarasikan di types.hal mendapatkan file output .java-nya sendiri (seperti yang diperlukan oleh Java). Misalnya, file types.hal berikut akan 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).