Dengan adanya file antarmuka HIDL, backend Java HIDL menghasilkan antarmuka Java, Stub, dan kode Proxy. Ini mendukung semua tipe skalar HIDL ([ u
] int
{ 8,16,32,64}_t, float, double,
dan enum
s), serta string, antarmuka, tipe safe_union, tipe struct, dan array serta vektor yang didukung tipe HIDL. Backend Java HIDL TIDAK mendukung tipe gabungan atau tipe fmq . Android 11 menambahkan dukungan untuk jenis memory
dan handle
.
Karena runtime Java tidak mendukung konsep bilangan bulat unsigned secara asli, semua tipe unsigned (dan enum berdasarkan tipe tersebut) secara diam-diam diperlakukan sebagai padanan yang ditandatangani, yaitu uint32_t
menjadi int
di antarmuka Java. Tidak ada konversi nilai yang dilakukan; pelaksana di sisi Java harus menggunakan nilai yang ditandatangani seolah-olah nilai tersebut tidak ditandatangani.
Enum
Enum tidak menghasilkan kelas enum Java tetapi diterjemahkan ke dalam kelas dalam yang berisi definisi konstanta statis untuk setiap kasus enum. Jika kelas enum berasal dari kelas enum lain, maka kelas tersebut mewarisi tipe penyimpanan kelas tersebut. Pencacahan berdasarkan tipe bilangan bulat tak bertanda tangan ditulis ulang menjadi padanan bertandanya. Karena tipe dasarnya adalah primitif, nilai default untuk bidang/variabel enum adalah nol meskipun tidak ada enumerator nol.
Misalnya, SomeBaseEnum
dengan tipe 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 menjadi:
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 diubah menjadi utf-8 sebagai tipe HIDL yang umum saat diangkut. Selain itu, sebuah String
tidak boleh bernilai null ketika diteruskan ke HIDL.
Pegangan dan memori
Android 11 memperkenalkan dukungan Java untuk jenis handle
dan memory
. Mereka masing-masing diterjemahkan ke dalam android.os.NativeHandle
dan android.os.HidlMemory
. Pegangan null dianggap valid, sedangkan memori null tidak.
Dalam kode server yang dihasilkan, argumen memori dan pegangan yang diterima hanya valid dalam lingkup pemanggilan metode. Jika implementasi server ingin memperpanjang umurnya, maka harus diduplikasi menggunakan metode dup()
resepektifnya. Instance yang dikembalikan dapat digunakan di luar pemanggilan metode dan harus ditutup dengan benar setelah selesai.
Dalam kode klien yang dihasilkan, handle dan instance memori yang dikirim sebagai argumen input dari metode yang dipanggil tidak perlu diduplikasi atau tetap valid setelah metode tersebut kembali. Namun, handle dan instance memori yang diterima sebagai argumen output secara otomatis diduplikasi oleh kode yang dibuat secara otomatis dan harus ditutup dengan benar setelah selesai. Hal ini berlaku baik argumen pengembalian tersebut muncul sebagai nilai pengembalian metode (dalam kasus nilai pengembalian tunggal) atau menggunakan gaya panggilan balik sinkron (digunakan dalam kasus nilai pengembalian ganda).
Untuk informasi selengkapnya tentang duplikasi dan penutupan, lihat dokumentasi kelas Java.
Array dan vektor
Array diterjemahkan ke dalam array Java dan vektor diterjemahkan ke dalam ArrayList<T>
di mana T adalah tipe objek yang sesuai, kemungkinan membungkus tipe 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 kelas Java dengan tata letak serupa. Misalnya:
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(); }
Tipe yang dideklarasikan
Setiap tipe tingkat atas yang dideklarasikan di types.hal
mendapatkan file keluaran .java sendiri (seperti yang disyaratkan 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 kelas dalam statis Bar (di Bar.java).