Diberikan file antarmuka HIDL, backend Java HIDL menghasilkan antarmuka Java, Stub, dan kode Proxy. Mendukung semua jenis skalar HIDL ([ u
] int
{ 8,16,32,64}_t, float, double,
dan enum
s), serta string, antarmuka, jenis safe_union, jenis struct, dan array dan vektor yang didukung jenis HIDL. Backend Java HIDL TIDAK mendukung tipe union atau tipe fmq . Android 11 menambahkan dukungan untuk jenis memory
dan handle
.
Karena Java runtime tidak mendukung konsep bilangan bulat yang tidak ditandatangani secara asli, semua tipe yang tidak ditandatangani (dan enum berdasarkan mereka) diperlakukan secara diam-diam 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 tidak ditandatangani.
enum
Enum tidak menghasilkan kelas enum Java tetapi sebaliknya diterjemahkan ke dalam kelas dalam yang berisi definisi konstanta statis untuk setiap kasus enum. Jika kelas enum diturunkan dari beberapa kelas enum lain, kelas tersebut mewarisi tipe penyimpanan kelas tersebut. Pencacahan berdasarkan tipe integer yang tidak ditandatangani ditulis ulang menjadi padanan yang ditandatangani. Karena tipe dasarnya adalah primitif, nilai default untuk bidang/variabel enum adalah nol bahkan ketika 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 sebagai:
public final class SomeEnum { static public final byte FIRST_CASE = 10; // no change static public final byte SECOND_CASE = -64; }
string
String
s 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 null saat diteruskan ke HIDL.
Menangani dan memori
Android 11 memperkenalkan dukungan Java untuk jenis handle
dan memory
. Mereka masing-masing diterjemahkan ke android.os.NativeHandle
dan android.os.HidlMemory
. Pegangan nol dianggap valid, sedangkan memori nol tidak.
Dalam kode server yang dihasilkan, memori yang diterima dan argumen pegangan hanya valid dalam lingkup pemanggilan metode. Jika implementasi server ingin memperpanjang masa pakainya, mereka harus diduplikasi menggunakan metode resepective dup()
mereka. Instance yang dikembalikan dapat digunakan di luar pemanggilan metode dan harus ditutup dengan benar saat selesai.
Dalam kode klien yang dihasilkan, kasus pegangan dan memori yang dikirim sebagai argumen input dari metode yang dipanggil tidak perlu diduplikasi atau tetap valid setelah metode kembali. Namun, pegangan dan instance memori yang diterima sebagai argumen keluaran secara otomatis diduplikasi oleh kode yang dibuat secara otomatis dan harus ditutup dengan benar saat selesai. Ini benar apakah argumen pengembalian tersebut muncul sebagai nilai pengembalian metode (dalam kasus nilai pengembalian tunggal) atau menggunakan gaya panggilan balik sinkron (digunakan dalam beberapa kasus nilai pengembalian).
Untuk informasi lebih lanjut tentang duplikasi dan penutupan, lihat dokumentasi kelas Java.
Array dan vektor
Array diterjemahkan ke array Java dan vektor diterjemahkan ke ArrayList<T>
di mana T adalah tipe objek yang sesuai, kemungkinan membungkus tipe skalar seperti vec<int32_t> => ArrayList<Integer>
). Sebagai 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 kelas Java dengan tata letak yang serupa. Sebagai 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 tipe tingkat atas yang dideklarasikan dalam types.hal
mendapatkan file output .java-nya sendiri (seperti yang dipersyaratkan 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 hidup di kelas dalam statis Bar (di Bar.java).