เมื่อได้รับไฟล์อินเทอร์เฟซ HIDL แบ็กเอนด์ Java HIDL จะสร้างอินเทอร์เฟซ Java, โค้ด Stub และ Proxy โดยรองรับประเภท HIDL สเกลาร์ทั้งหมด
([u]int{8,16,32,64}_t, float, double, และ
enums) รวมถึงสตริง, อินเทอร์เฟซ, ประเภท safe_union, ประเภท struct
types, อาร์เรย์ และเวกเตอร์ของประเภท HIDL ที่รองรับ แบ็กเอนด์ Java HIDL ไม่รองรับประเภท Union หรือประเภท FMQ Android 11 เพิ่มการรองรับประเภท memory และ handle
เนื่องจากรันไทม์ Java ไม่รองรับแนวคิดของจำนวนเต็มที่ไม่มีเครื่องหมายโดยกำเนิด
ระบบจึงถือว่าประเภทที่ไม่มีเครื่องหมายทั้งหมด (และ Enum ที่อิงตามประเภทดังกล่าว) เป็นประเภทที่มีเครื่องหมายที่เทียบเท่าโดยไม่มีการแจ้งเตือน เช่น uint32_t จะกลายเป็น int ใน
อินเทอร์เฟซ Java ระบบจะไม่ทำการแปลงค่า ผู้ใช้ที่ใช้ Java ต้องใช้ค่าที่มีเครื่องหมายราวกับว่าเป็นค่าที่ไม่มีเครื่องหมาย
Enums
Enum จะไม่สร้างคลาส Enum ของ Java แต่จะแปลเป็นคลาสภายในที่มีการกำหนดค่าคงที่แบบคงที่สำหรับแต่ละเคส Enum แทน หากคลาส Enum สืบทอดมาจากคลาส Enum อื่น คลาส Enum จะรับช่วงประเภทพื้นที่เก็บข้อมูลของคลาสนั้น ระบบจะเขียน Enum ที่อิงตามประเภทจำนวนเต็มที่ไม่มีเครื่องหมายใหม่เป็นประเภทที่มีเครื่องหมายที่เทียบเท่า เนื่องจากประเภทพื้นฐานเป็นประเภทข้อมูลดั้งเดิม ค่าเริ่มต้นสำหรับฟิลด์/ตัวแปร Enum จึงเป็น 0 แม้ว่าจะไม่มีตัวแจงนับ 0 ก็ตาม
ตัวอย่างเช่น SomeBaseEnum ที่มีประเภท uint8_t
enum SomeBaseEnum : uint8_t { foo = 3 }; enum SomeEnum : SomeBaseEnum { quux = 33, goober = 127 };
… จะกลายเป็น
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; }
และ
enum SomeEnum : uint8_t { FIRST_CASE = 10, SECOND_CASE = 192 };
… จะเขียนใหม่เป็น
public final class SomeEnum { static public final byte FIRST_CASE = 10; // no change static public final byte SECOND_CASE = -64; }
สตริง
String ใน Java เป็น utf-8 หรือ utf-16 แต่จะแปลงเป็น utf-8 เป็นประเภท HIDL ทั่วไปเมื่อมีการส่ง นอกจากนี้ String ต้องไม่เป็น Null เมื่อส่งไปยัง HIDL
Handle และ Memory
Android 11 ขอแนะนำการรองรับ Java สำหรับประเภท handle และ
memory โดยจะแปลเป็น android.os.NativeHandle และ
android.os.HidlMemory ตามลำดับ ระบบจะถือว่า Handle ที่เป็น Null ใช้ได้ แต่ Memory ที่เป็น Null
ใช้ไม่ได้
ในโค้ด เซิร์ฟเวอร์ ที่สร้างขึ้น อาร์กิวเมนต์ Memory และ Handle ที่ได้รับจะใช้ได้ภายในขอบเขตของการเรียกใช้เมธอดเท่านั้น หากการติดตั้งใช้งานเซิร์ฟเวอร์ต้องการขยายอายุการใช้งานของอาร์กิวเมนต์ดังกล่าว จะต้องทำซ้ำโดยใช้เมธอด dup() ที่เกี่ยวข้อง อินสแตนซ์ที่ส่งคืนสามารถใช้ได้นอกเหนือจากการเรียกใช้เมธอด และควรปิดอย่างเหมาะสมเมื่อใช้งานเสร็จแล้ว
ในโค้ด ไคลเอ็นต์ ที่สร้างขึ้น อินสแตนซ์ Handle และ Memory ที่ส่ง เป็นอาร์กิวเมนต์อินพุตของเมธอดที่เรียกใช้ไม่จำเป็นต้องทำซ้ำหรือเก็บไว้ให้ใช้ได้หลังจากที่เมธอดส่งคืน อย่างไรก็ตาม โค้ดที่สร้างขึ้นโดยอัตโนมัติจะทำซ้ำอินสแตนซ์ Handle และ Memory ที่ได้รับ เป็นอาร์กิวเมนต์เอาต์พุตโดยอัตโนมัติ และต้องปิดอย่างเหมาะสมเมื่อใช้งานเสร็จแล้ว ซึ่งจะเป็นจริงไม่ว่าอาร์กิวเมนต์ที่ส่งคืนจะปรากฏเป็นค่าที่ส่งคืนของเมธอด (ในกรณีที่มีค่าที่ส่งคืนค่าเดียว) หรือใช้รูปแบบการเรียกกลับแบบซิงโครนัส (ใช้ในกรณีที่มีค่าที่ส่งคืนหลายค่า)
ดูข้อมูลเพิ่มเติมเกี่ยวกับการทำซ้ำและการปิดได้ที่เอกสารประกอบของคลาส Java
อาร์เรย์และเวกเตอร์
ระบบจะแปลอาร์เรย์เป็นอาร์เรย์ Java และแปลเวกเตอร์เป็น
ArrayList<T> โดยที่ T เป็นประเภทออบเจ็กต์ที่เหมาะสม ซึ่งอาจมีการ
ห่อประเภทสเกลาร์ เช่น vec<int32_t> =>
ArrayList<Integer>) ตัวอย่างเช่น
takeAnArray(int32_t[3] array); returnAVector() generates (vec<int32_t> result);
… จะกลายเป็น
void takeAnArray(int[] array); ArrayList<Integer> returnAVector();
โครงสร้าง
ระบบจะแปลโครงสร้างเป็นคลาส Java ที่มีเลย์เอาต์คล้ายกัน ตัวอย่างเช่น
struct Bar { vec<bool> someBools; }; struct Foo { int32_t a; int8_t b; float[10] c; Bar d; };
… จะกลายเป็น
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(); }
ประเภทที่ประกาศ
ประเภทระดับบนสุดแต่ละประเภทที่ประกาศไว้ใน types.hal จะมีไฟล์เอาต์พุต .java ของตัวเอง (ตามที่ Java กำหนด) ตัวอย่างเช่น ไฟล์ types.hal ต่อไปนี้จะทำให้มีการสร้างไฟล์เพิ่มเติม 2 ไฟล์ (Foo.java และ Bar.java)
struct Foo { ... }; struct Bar { ... struct Baz { }; ... };
การกำหนด Baz จะอยู่ในคลาสภายในแบบคงที่ของ Bar (ใน Bar.java)