Tipos de datos

Dado un archivo de interfaz HIDL, el backend Java HIDL genera interfaces Java, código Stub y Proxy. Admite todos los tipos HIDL escalares ([ u ] int { 8,16,32,64}_t, float, double, y enum s), así como cadenas, interfaces, tipos safe_union, tipos de estructuras y matrices y vectores de archivos admitidos. Tipos HIDL. El backend de Java HIDL NO admite tipos de unión ni tipos de fmq . Android 11 agrega soporte para los tipos memory y handle .

Como el tiempo de ejecución de Java no admite el concepto de enteros sin signo de forma nativa, todos los tipos sin signo (y enumeraciones basadas en ellos) se tratan silenciosamente como sus equivalentes con signo, es decir, uint32_t se convierte en un int en la interfaz de Java. No se realiza ninguna conversión de valor; el implementador del lado de Java debe utilizar los valores firmados como si no estuvieran firmados.

Enumeraciones

Las enumeraciones no generan clases de enumeración de Java, sino que se traducen en clases internas que contienen una definición constante estática para cada caso de enumeración. Si la clase enum deriva de alguna otra clase enum, hereda el tipo de almacenamiento de esa clase. Las enumeraciones basadas en un tipo entero sin signo se reescriben en su equivalente con signo. Dado que el tipo subyacente es primitivo, el valor predeterminado para los campos/variables de enumeración es cero incluso cuando no hay un enumerador cero.

Por ejemplo, un SomeBaseEnum con un tipo 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;
}

Instrumentos de cuerda

Las String en Java son utf-8 o utf-16, pero se convierten a utf-8 como el tipo HIDL común cuando se transportan. Además, una String no debe ser nula cuando se pasa a HIDL.

Mango y memoria

Android 11 introduce compatibilidad con Java para los tipos handle y memory . Están traducidos a android.os.NativeHandle y android.os.HidlMemory , respectivamente. Un identificador nulo se considera válido, mientras que una memoria nula no lo es.

En el código de servidor generado, la memoria recibida y los argumentos de manejo solo son válidos dentro del alcance de la invocación del método. Si la implementación del servidor quiere extender su vida útil, deben duplicarse usando sus respectivos métodos dup() . La instancia devuelta se puede utilizar más allá de la invocación del método y debe cerrarse correctamente cuando termine.

En el código de cliente generado, los identificadores y las instancias de memoria que se envían como argumentos de entrada del método llamado no necesitan duplicarse ni mantenerse válidos después de que regresa el método. Sin embargo, los identificadores y las instancias de memoria que se reciben como argumentos de salida se duplican automáticamente mediante el código generado automáticamente y deben cerrarse correctamente cuando termine. Esto es cierto ya sea que esos argumentos de retorno aparezcan como valores de retorno del método (en el caso de valor de retorno único) o usando el estilo de devolución de llamada síncrona (usado en el caso de valor de retorno múltiple).

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

Matrices y vectores

Las matrices se traducen a matrices Java y los vectores se traducen a ArrayList<T> donde T es el tipo de objeto apropiado, posiblemente envolviendo 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 a clases 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 de salida .java (según 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 vive en una clase interna estática de Bar (en Bar.java).