Với tệp giao diện HIDL, phần phụ trợ Java HIDL sẽ tạo các giao diện Java,
Mã gốc và mã proxy. API này hỗ trợ mọi loại HIDL vô hướng
([u
]int
{8,16,32,64}_t, float, double,
và
enum
), cũng như chuỗi, giao diện, kiểu safety_union, struct
loại, mảng và vectơ của các loại HIDL được hỗ trợ. Phần phụ trợ Java HIDL
KHÔNG hỗ trợ loại hợp nhất hoặc loại fmq. của Android
11 bổ sung khả năng hỗ trợ cho memory
và
handle
loại.
Vì thời gian chạy Java không hỗ trợ khái niệm về số nguyên chưa ký,
tất cả các kiểu chưa có chữ ký (và enum dựa trên các kiểu này) đều được tự động xử lý là
tương đương có dấu, tức là uint32_t
trở thành int
trong
giao diện Java. Không có lượt chuyển đổi giá trị nào được thực hiện; trình triển khai trên
Phía Java phải sử dụng các giá trị đã ký như thể chúng chưa được ký.
Liệt kê
Enum không tạo ra các lớp enum Java mà thay vào đó được dịch thành lớp trong các lớp chứa định nghĩa hằng số tĩnh cho từng trường hợp enum. Nếu enum lớp này bắt nguồn từ một số lớp enum khác, lớp này kế thừa loại hình lưu trữ của lớp đó. Các phép liệt kê dựa trên kiểu số nguyên chưa ký sẽ được viết lại thành các phép tính có dấu tương đương. Vì loại cơ bản là kiểu dữ liệu gốc, nên giá trị mặc định cho Trường/biến enum bằng 0 ngay cả khi không có enum nào bằng 0.
Ví dụ: SomeBaseEnum
thuộc loại
uint8_t
:
enum SomeBaseEnum : uint8_t { foo = 3 }; enum SomeEnum : SomeBaseEnum { quux = 33, goober = 127 };
... trở thành:
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; }
Và:
enum SomeEnum : uint8_t { FIRST_CASE = 10, SECOND_CASE = 192 };
... được viết lại thành:
public final class SomeEnum { static public final byte FIRST_CASE = 10; // no change static public final byte SECOND_CASE = -64; }
Chuỗi
String
trong Java là utf-8 hoặc utf-16 nhưng được chuyển đổi thành utf-8
là loại HIDL phổ biến khi được vận chuyển. Ngoài ra, String
không được có giá trị rỗng khi truyền vào HIDL.
Tên người dùng và bộ nhớ
Android 11 ra mắt tính năng hỗ trợ Java cho handle
và
memory
loại. Các chú giải này được dịch sang android.os.NativeHandle
và
android.os.HidlMemory
. Một ô điều khiển rỗng được xem là hợp lệ, trong khi một giá trị rỗng được coi là hợp lệ.
bộ nhớ của bạn thì không.
Trong mã máy chủ đã tạo, các đối số bộ nhớ nhận được và đối số tên người dùng chỉ
hợp lệ trong phạm vi của lệnh gọi phương thức. Nếu việc triển khai máy chủ muốn mở rộng
vòng đời, các đối số đó phải được sao chép bằng phương thức dup()
phản cảm. Chiến lược phát hành đĩa đơn
thực thể được trả về có thể được dùng ngoài lệnh gọi phương thức và phải được đóng đúng cách khi hoàn tất
với.
Trong mã ứng dụng đã tạo, tay cầm và các thực thể bộ nhớ đã gửi dưới dạng đối số đầu vào của phương thức được gọi không cần được sao chép cũng như giữ lại có hiệu lực sau khi phương thức này trả về. Tuy nhiên, tay điều khiển và các thực thể bộ nhớ nhận được vì đối số đầu ra được tự động sao chép bởi mã được tạo tự động và phải được đóng đúng cách khi tạo xong. Điều này đúng cho dù các lượt trả về đối số xuất hiện dưới dạng giá trị trả về của phương thức (trong trường hợp giá trị trả về duy nhất) hoặc sử dụng kiểu gọi lại đồng bộ (dùng trong trường hợp giá trị trả về nhiều lần).
Để biết thêm thông tin về việc sao chép và đóng, hãy xem tài liệu về các lớp Java.
Mảng và vectơ
Các mảng được dịch sang mảng Java và vectơ được dịch thành
ArrayList<T>
trong đó T là loại đối tượng thích hợp, có thể là
gói các kiểu vô hướng, chẳng hạn như vec<int32_t> =>
ArrayList<Integer>
). Ví dụ:
takeAnArray(int32_t[3] array); returnAVector() generates (vec<int32_t> result);
... trở thành:
void takeAnArray(int[] array); ArrayList<Integer> returnAVector();
Cấu trúc
Các cấu trúc được chuyển đổi sang các lớp Java có bố cục tương tự. Ví dụ:
struct Bar { vec<bool> someBools; }; struct Foo { int32_t a; int8_t b; float[10] c; Bar d; };
... trở thành:
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(); }
Các kiểu đã khai báo
Mỗi loại cấp cao nhất được khai báo trong types.hal
sẽ có .java riêng
tệp đầu ra (theo yêu cầu của Java). Ví dụ: như sau
Tệp types.hal
dẫn đến việc tạo thêm hai tệp (Foo.java
và Bar.java):
struct Foo { ... }; struct Bar { ... struct Baz { }; ... };
Định nghĩa về Baz nằm trong một lớp tĩnh bên trong của Bar (trong Bar.java
).