Kiểu dữ liệu

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,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 memoryhandle 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 handlememory loại. Các chú giải này được dịch sang android.os.NativeHandleandroid.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).