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.