Tipos de datos

Con un archivo de interfaz HIDL, el backend HIDL de Java genera interfaces Java, código auxiliar y código proxy. Admite todos los tipos escalares de HIDL ([u]int{8,16,32,64}_t, float, double, y enum), así como cadenas, interfaces, tipos safe_union y struct tipos de datos, y las matrices y los vectores de tipos de HIDL admitidos. El backend HIDL de Java NO admite tipos de unión ni tipos fmq. En Android 11 agrega compatibilidad con memory y handle.

Como el entorno de ejecución de Java no admite el concepto de números enteros sin firmar todos los tipos sin firma (y las enumeraciones basadas en ellos) se tratan en silencio como equivalentes con signo, es decir, uint32_t se convierte en int en la interfaz de Java. No se realiza ninguna conversión de valor. el implementador en la El lado de Java debe usar los valores con firma como si no estuvieran firmados.

Enums

Las enumeraciones no generan clases de enumeración de Java, sino que se traducen a valores internos. que contienen una definición de constante estática para cada caso enum. Si la enum deriva de otra clase de tipo enum, hereda el tipo de almacenamiento de esa clase. Las enumeraciones basadas en un tipo de número entero sin firma se vuelven a escribir en su equivalente. Como el tipo subyacente es un primitivo, el valor predeterminado para enum es cero incluso cuando no hay un enumerador cero.

Por ejemplo, un objeto SomeBaseEnum con el tipo de uint8_t

enum SomeBaseEnum : uint8_t { foo = 3 };
enum SomeEnum : SomeBaseEnum {
    quux = 33,
    goober = 127
};

... se convierte en:

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

Y

enum SomeEnum : uint8_t {
    FIRST_CASE = 10,
    SECOND_CASE = 192
};

... se reescribe como:

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

Strings

String en Java es utf-8 o utf-16, pero se convierte a utf-8 como el tipo de HIDL común cuando se transportan. Además, String no deben ser nulos cuando se pasan al HIDL.

Identificador y memoria

Android 11 presenta compatibilidad de Java para handle y memory. Se traducen al android.os.NativeHandle y android.os.HidlMemory, respectivamente. Un controlador nulo se considera válido, mientras que uno nulo la memoria.

En el código server generado, la memoria recibida y los argumentos de controlador solo se muestran son válidas dentro del alcance de la invocación del método. Si la implementación del servidor quiere extender durante el ciclo de vida, se deben duplicar mediante sus métodos dup() respectivos. El La instancia que se muestra puede usarse más allá de la invocación del método y debería cerrarse correctamente al terminar tus amigos.

En el código client generado, los controladores y las instancias de memoria que se sent como argumentos de entrada del método llamado no necesitan duplicarse ni mantenerse. son válidos después de que el método devuelve. Sin embargo, los controladores y las instancias de memoria received como argumentos de salida se duplican automáticamente código generado automáticamente y debe cerrarse de forma correcta cuando ya no se utilice. Esto es así, independientemente de que los argumentos aparecerán como valores de retorno del método (en el caso de un valor de retorno único) o si usas el estilo de devolución de llamada síncrono (se usa en el caso de valores de retorno múltiples).

Para obtener más información sobre la duplicación y el cierre, consulta la documentación de las clases de Java.

Arreglos y vectores

Los arrays se traducen en arrays de Java, y los vectores se traducen en ArrayList<T>, en el que T es el tipo de objeto apropiado, posiblemente uniendo tipos escalares, como vec<int32_t> => ArrayList<Integer>). Por ejemplo:

takeAnArray(int32_t[3] array);
returnAVector() generates (vec<int32_t> result);

... se convierte en:

void takeAnArray(int[] array);
ArrayList<Integer> returnAVector();

Estructuras

Las estructuras se traducen en clases de Java con un diseño similar. Por ejemplo:

struct Bar {
 vec<bool> someBools;
};
struct Foo {
 int32_t a;
 int8_t b;
 float[10] c;
 Bar d;
};

... se convierte en:

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

Tipos declarados

Cada tipo de nivel superior declarado en types.hal obtiene su propio archivo .java. de salida (como lo requiere Java). Por ejemplo, el siguiente archivo types.hal da como resultado la creación de dos archivos adicionales (Foo.java y Bar.java):

struct Foo {
 ...
};

struct Bar {
 ...

 struct Baz {
 };

 ...
};

La definición de Baz se encuentra en una clase interna estática de Bar (en Bar.java).