Veri Türleri

Bir HIDL arayüz dosyası verildiğinde, Java HIDL arka ucu, Java arayüzleri, Stub ve Proxy kodunu oluşturur. Tüm skaler HIDL türlerini ([ u ] int { 8,16,32,64}_t, float, double, ve enum s) yanı sıra dizeleri, arayüzleri, Safe_union türlerini, yapı türlerini ve desteklenen dizileri ve vektörleri destekler. HIDL türleri. Java HIDL arka ucu birleşim türlerini veya fmq türlerini DESTEKLEMEZ . Android 11, memory ve handle türleri için destek ekler.

Java çalışma zamanı, imzasız tamsayılar kavramını yerel olarak desteklemediğinden, tüm imzasız türler (ve bunlara dayalı numaralandırmalar) sessizce imzalı eşdeğerleri olarak kabul edilir, yani uint32_t , Java arayüzünde bir int haline gelir. Hiçbir değer dönüşümü gerçekleştirilmez; Java tarafındaki uygulayıcının imzalı değerleri imzasızmış gibi kullanması gerekir.

Numaralandırmalar

Numaralandırmalar Java numaralandırma sınıfları oluşturmaz, bunun yerine her numaralandırma 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, o sınıfın depolama tipini devralır. İşaretsiz bir tamsayı türüne dayalı numaralandırmalar, imzalı eşdeğerlerine yeniden yazılır. Temel tür bir ilkel olduğundan, sıfır numaralandırıcı olmadığında bile numaralandırma 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
};

… şuna dönüşür:

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ılmıştır:

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

Teller

Java'daki String utf-8 veya utf-16'dır ancak aktarıldığında ortak HIDL türü olarak utf-8'e dönüştürülür. Ayrıca, HIDL'ye aktarıldığında bir String null olmaması gerekir.

Kulp ve hafıza

Android 11, handle ve memory türleri için Java desteğini sunar. Bunlar sırasıyla android.os.NativeHandle ve android.os.HidlMemory dillerine çevrilir. Boş bir tanıtıcı geçerli kabul edilirken boş bellek geçerli sayılmaz.

Oluşturulan sunucu kodunda, alınan bellek ve tanıtıcı argümanları yalnızca yöntem çağrısı kapsamında geçerlidir. Sunucu uygulaması ömrünü uzatmak istiyorsa, bunların kendi dup() yöntemleri kullanılarak kopyalanması gerekir. Döndürülen örnek, yöntem çağrısının ötesinde kullanılabilir ve işlem tamamlandığında uygun şekilde kapatılmalıdır.

Oluşturulan istemci kodunda, çağrılan yöntemin giriş bağımsız değişkenleri olarak gönderilen tanıtıcıların ve bellek örneklerinin, yöntem geri döndükten sonra çoğaltılmasına veya geçerli tutulmasına gerek yoktur. Ancak çıktı bağımsız değişkenleri olarak alınan tanıtıcılar ve bellek örnekleri, otomatik olarak oluşturulan kod tarafından otomatik olarak çoğaltılır ve işlem bittiğinde düzgün şekilde kapatılması gerekir. Bu, dönüş bağımsız değişkenlerinin, yöntemin dönüş değerleri olarak (tek dönüş değeri durumunda) veya eşzamanlı geri çağırma stilini (çoklu dönüş değeri durumunda kullanılır) kullanarak görünmesine bakılmaksızın doğrudur.

Çoğaltma 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 çevrilir ve vektörler ArrayList<T> ye çevrilir; burada T uygun nesne türüdür ve muhtemelen vec<int32_t> => ArrayList<Integer> gibi skaler türleri sarmalar. Örneğin:

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

… şuna dönüşür:

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

Yapılar

Yapılar benzer bir düzen ile 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;
};

… şuna dönüşür:

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

Bildirilen türler

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

struct Foo {
 ...
};

struct Bar {
 ...

 struct Baz {
 };

 ...
};

Baz'ın tanımı Bar'ın statik bir iç sınıfında (Bar.Java'da) yaşar.