Veri türleri

Java HIDL arka ucu, bir HIDL arayüz dosyası verildiğinde Java arayüzleri, Stub ve Proxy kodu oluşturur. Tüm skaler HIDL türlerini ("[u]int{8,16,32,64}_t, float, double, ve enums}), dizelerin yanı sıra arayüzleri, safe_union türlerini, struct türlerini ve desteklenen HIDL türlerinin dizilerini ve vektörlerini destekler. Java HIDL arka ucu birleştirme türlerini veya fmq türlerini DESTEKLEMEZ. Android 11'de memory ve handle türleri için destek eklendi.

Java çalışma zamanı, işaretsiz tam sayılar kavramını doğal olarak desteklemediğinden, işaretsiz tüm türler (ve bunlara dayalı enum'lar) sessizce işaretli eşdeğerleriyle işlenir. Yani uint32_t, Java arayüzünde int olur. Değer dönüşümü yapılmaz. Java tarafındaki uygulayıcı, imzalı değerleri imzasızmış gibi kullanmalıdır.

Numaralandırmalar

Enum'ler Java enum sınıfları oluşturmaz. Bunun yerine, her enum durumu için statik bir sabit tanım içeren iç sınıflara çevrilir. Enum sınıfı başka bir enum sınıfından türetilmişse bu sınıfın depolama türünü devralır. İmzasız bir tam sayı türüne dayalı listeleme, imzalı eşdeğeri olarak yeniden yazılır. Temel tür ilkel olduğundan, sıfır listeleyici olmasa bile enum alanları/değişkenleri için varsayılan değer sıfırdır.

Örneğin, uint8_t türüne sahip bir SomeBaseEnum:

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

… şu hâle gelir:

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

Ve:

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

… şu şekilde yeniden yazılır:

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

Yaylı Çalgılar

Java'da String, utf-8 veya utf-16'dır ancak aktarılırken ortak HIDL türü olarak utf-8'e dönüştürülür. Ayrıca, String, HIDL'ye aktarılırken null olmamalıdır.

Herkese açık kimlik ve bellek

Android 11, handle ve memory türleri için Java desteğini kullanıma sunar. Bunlar sırasıyla android.os.NativeHandle ve android.os.HidlMemory olarak çevrilir. Boş bir tutamak geçerli kabul edilirken boş hafıza geçerli kabul edilmez.

Oluşturulan sunucu kodunda, alınan bellek ve tutamaç bağımsız değişkenleri yalnızca yöntem çağrısı kapsamında geçerlidir. Sunucu uygulaması, kullanım sürelerini uzatmak istiyorsa ilgili dup() yöntemleri kullanılarak kopyalanması gerekir. Döndürülen örnek, yöntem çağrısının ötesinde kullanılabilir ve kullanımdan kaldırıldığında düzgün şekilde kapatılmalıdır.

Oluşturulan istemci kodunda, çağrılan yöntemin giriş bağımsız değişkenleri olarak gönderilen tutamaçların ve bellek örneklerinin, yöntem döndükten sonra kopyalanmasına veya geçerli tutulmasına gerek yoktur. Ancak, çıkış bağımsız değişkenleri olarak alınan tutamaç ve bellek örnekleri, otomatik olarak oluşturulan kod tarafından otomatik olarak kopyalanır ve kullanımdan kaldırıldığında uygun şekilde kapatılmalıdır. Bu durum, döndürülen bağımsız değişkenlerin yöntemin döndürülen değerleri olarak (tek döndürülen değer durumunda) veya senkron geri çağırma stili kullanılarak (birden fazla döndürülen değer durumunda) görünmesi durumunda geçerlidir.

Kopyalama ve kapatma hakkında daha fazla bilgi için Java sınıflarının belgelerine bakın.

Diziler ve vektörler

Diziler Java dizilerine, vektörler ise ArrayList<T> (T, uygun nesne türüdür ve vec<int32_t> => ArrayList<Integer> gibi skaler türleri sarmalayabilir) olarak çevrilir. Örneğin:

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

… şu hâle gelir:

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

Yapılar

Yapılar, benzer bir düzene sahip Java sınıflarına çevrilir. Örneğin:

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

… şu hâle gelir:

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

Beyan edilen türler

types.hal içinde tanımlanan her üst düzey tür, kendi .java çıkış dosyasını alır (Java'nın gerektirdiği şekilde). Örneğin, aşağıdaki types.hal dosyası iki ek dosyanın oluşturulmasına neden olur (Foo.java ve Bar.java):

struct Foo {
 ...
};

struct Bar {
 ...

 struct Baz {
 };

 ...
};

Baz'ın tanımı, Bar'ın statik bir iç sınıfında (Bar.java içinde) bulunur.