数据类型

给定一个 HIDL 接口文件,Java HIDL 后端会生成 Java 接口、存根和代理代码。它支持所有标量 HIDL 类型([u]int{8,16,32,64}_t, float, double,enum),以及受支持 HIDL 类型的字符串、接口、结构类型、数组和矢量。Java HIDL 后端不支持联合类型、原生句柄、共享内存和 fmq 类型

由于 Java 运行时本身不支持未签名整数的概念,所有未签名类型(以及基于这些类型的枚举)都会被自动视为其已签名的等效项,也就是说,uint32_t 在 Java 接口中会变为 int。不进行任何值转换;Java 端的实现人员必须将已签名值当做未签名值来使用。

枚举

枚举不会生成 Java 枚举类,而是转换为包含各个枚举用例的静态常量定义的内部类。如果枚举类派生自其他枚举类,则会沿用后者的存储类型。 基于未签名整数类型的枚举将重写为其已签名的等效项。

例如,一个类型为 uint8_tSomeBaseEnum

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;
}

字符串

Java 中的 String 为 utf-8 或 utf-16,但在传输时会转换为 utf-8 作为常见的 HIDL 类型。另外,String 在传入 HIDL 时不能为空。

数组和矢量

数组会转换为 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 文件会导致创建两个额外的文件(Foo.java 和 Bar.java):

struct Foo {
 ...
};

struct Bar {
 ...

 struct Baz {
 };

 ...
};

Baz 的定义位于 Bar 的静态内部类中(在 Bar.java 内)。