Jenis data

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).