Jenis Data

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