Mengingat file antarmuka HIDL, backend HIDL Java menghasilkan kode antarmuka, Stub, dan Proxy Java. Binder mendukung semua jenis HIDL skalar
([u
]int
{8,16,32,64}_t, float, double,
dan
enum
s), serta string, antarmuka, jenis safe_union, jenis struct, dan array serta vektor jenis HIDL yang didukung. Backend HIDL Java
TIDAK mendukung jenis gabungan 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 yang didasarkan padanya) secara diam-diam diperlakukan sebagai
padanan bertanda tangannya, yaitu uint32_t
menjadi int
di
antarmuka Java. Tidak ada konversi nilai yang dilakukan; pelaksana di sisi Java harus menggunakan nilai bertanda seolah-olah nilai tersebut tidak bertanda.
Enum
Enum tidak menghasilkan class enum Java, tetapi diterjemahkan menjadi 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 diubah menjadi bilangan bulat yang bertanda. Karena jenis dasarnya 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 menjadi utf-8
sebagai jenis HIDL umum saat ditranspor. Selain itu, String
tidak boleh null saat diteruskan ke HIDL.
Gagang dan memori
Android 11 memperkenalkan dukungan Java untuk jenis handle
dan
memory
. Masing-masing diterjemahkan ke dalam bahasa 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 ingin memperpanjang masa aktifnya, implementasi server harus diduplikasi menggunakan metode dup()
masing-masing. Instance yang ditampilkan dapat digunakan di luar pemanggilan metode dan harus ditutup dengan benar setelah selesai digunakan.
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 ditampilkan. Namun, handle dan instance 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 return tersebut muncul sebagai nilai return metode (dalam kasus nilai return tunggal) atau menggunakan gaya callback sinkron (digunakan dalam kasus nilai return 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
membungkus 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 dalam 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 ada di inner class statis Bar (di Bar.java
).