Kiểu dữ liệu

Với một tệp giao diện HIDL, phần phụ trợ Java HIDL sẽ tạo ra các giao diện Java, mã Sơ khai và mã Proxy. Nó hỗ trợ tất cả các loại HIDL vô hướng ([ u ] int { 8,16,32,64}_t, float, double,enum s), cũng như các chuỗi, giao diện, loại safe_union, loại cấu trúc, mảng và vectơ được hỗ trợ các loại HIDL. Phần phụ trợ Java HIDL KHÔNG hỗ trợ các loại kết hợp hoặc các loại fmq . Android 11 bổ sung hỗ trợ cho các loại bộ memoryhandle .

Vì thời gian chạy Java không hỗ trợ khái niệm về số nguyên không dấu, nên tất cả các kiểu không dấu (và các enum dựa trên chúng) đều được xử lý âm thầm như các giá trị tương đương có dấu của chúng, tức là uint32_t trở thành int trong giao diện Java. Không có chuyển đổi giá trị nào được thực hiện; người triển khai ở phía Java phải sử dụng các giá trị đã ký như thể chúng chưa được ký.

Enum

Enums không tạo ra các lớp enum Java mà thay vào đó được dịch sang các lớp bên trong chứa định nghĩa hằng số tĩnh cho từng trường hợp enum. Nếu lớp enum xuất phát từ một số lớp enum khác, nó sẽ kế thừa kiểu lưu trữ của lớp đó. Các phép liệt kê dựa trên kiểu số nguyên không dấu được viết lại thành kiểu số nguyên có dấu tương đương. Vì kiểu cơ bản là kiểu nguyên thủy, nên giá trị mặc định cho các trường/biến enum bằng 0 ngay cả khi không có điều tra viên bằng 0.

Ví dụ: SomeBaseEnum 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 là:

public final class SomeEnum {
    static public final byte FIRST_CASE  = 10;  // no change
    static public final byte SECOND_CASE = -64;
}

Dây

String trong Java là utf-8 hoặc utf-16 nhưng được chuyển đổi thành utf-8 dưới dạng loại HIDL phổ biến khi được vận chuyển. Ngoài ra, String không được rỗng khi được chuyển vào HIDL.

Xử lý và bộ nhớ

Android 11 giới thiệu khả năng hỗ trợ Java cho các loại bộ handlememory . Chúng được dịch sang android.os.NativeHandleandroid.os.HidlMemory tương ứng. Bộ nhớ null được coi là hợp lệ, trong khi bộ nhớ null thì không.

Trong mã máy chủ được tạo, bộ nhớ nhận được và các đối số xử lý chỉ hợp lệ trong phạm vi gọi phương thức. Nếu việc triển khai máy chủ muốn kéo dài thời gian tồn tại của chúng, thì chúng phải được sao chép bằng các phương thức dup() tương ứng. Phiên bản được trả về có thể được sử dụng ngoài lệnh gọi phương thức và phải được đóng đúng cách khi thực hiện.

Trong mã máy khách được tạo, các thẻ điều khiển và phiên bản bộ nhớ được gửi dưới dạng đối số đầu vào của phương thức được gọi không cần phải sao chép cũng như không cần giữ nguyên giá trị hợp lệ sau khi phương thức trả về. Tuy nhiên, các thẻ điều khiển và phiên bản bộ nhớ được nhận dưới dạng đối số đầu ra sẽ tự động được sao chép bằng mã được tạo tự động và phải được đóng đúng cách khi thực hiện xong. Điều này đúng cho dù các đối số trả về đó 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ề đơn) hay sử dụng kiểu gọi lại đồng bộ (được sử dụng trong trường hợp nhiều giá trị trả về).

Để biết thêm thông tin về sao chép và đóng, hãy xem tài liệu về các lớp Java.

Mảng và vectơ

Mảng được dịch sang mảng Java và vectơ được dịch sang ArrayList<T> trong đó T là loại đối tượng thích hợp, có thể bao gồm các loại vô hướng 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 dịch 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 loại được khai báo

Mỗi loại cấp cao nhất được khai báo trong types.hal sẽ có tệp đầu ra .java riêng (theo yêu cầu của Java). Ví dụ: tệp types.hal sau đây dẫn đến hai tệp bổ sung được tạo (Foo.java và Bar.java):

struct Foo {
 ...
};

struct Bar {
 ...

 struct Baz {
 };

 ...
};

Định nghĩa của Baz tồn tại trong một lớp tĩnh bên trong của Bar (trong Bar.java).