给定一个 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_t
的 SomeBaseEnum
:
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 内)。