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 enum
s) destekler. Ayrıca dizeleri, arayüzleri, safe_union türlerini, struct türlerini ve desteklenen HIDL türlerinin dizilerini ve vektörlerini de destekler. 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ı, işaretsiz tam sayı kavramını yerel olarak desteklemediğinden, tüm işaretsiz türler (ve bunlara dayalı numaralandırmalar) sessizce işaretli eşdeğerleri olarak ele alınır. Örneğin, Java arayüzünde uint32_t
, 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
Numaralandırmalar Java numaralandırma sınıfları oluşturmaz, bunun yerine her numaralandırma durumu için statik sabit tanım içeren iç sınıflara çevrilir. Numaralandırma sınıfı başka bir numaralandırma sınıfından türetilmişse bu sınıfın depolama türünü devralır. İşaretsiz tam sayı türüne dayalı numaralandırmalar, işaretli eşdeğerlerine yeniden yazılır. Temel tür bir ilkel olduğundan, sıfır numaralandırıcı olmasa bile enum alanları/değişkenleri için varsayılan değer sıfırdır.
Örneğin, türü uint8_t
olan 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 taşınırken ortak HIDL türü olarak utf-8'e dönüştürülür. Ayrıca, HIDL'ye iletildiğinde String
boş olmamalıdır.
İşleyici ve bellek
Android 11, handle
ve memory
türleri için Java desteği sunar. Bu metinler sırasıyla android.os.NativeHandle
ve android.os.HidlMemory
dillerine çevrilir. Null tanıtıcı geçerli kabul edilirken null bellek geçerli kabul edilmez.
Oluşturulan sunucu kodunda, alınan bellek ve işleyici bağımsız değişkenleri yalnızca yöntem çağrısının kapsamı içinde geçerlidir. Sunucu uygulaması ömrünü uzatmak istiyorsa ilgili dup()
yöntemleri kullanılarak çoğaltılmalıdır. Döndürülen örnek, yöntem çağrısının ötesinde kullanılabilir ve işi bittiğinde 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 yinelenmesi veya geçerli tutulması gerekmez. Ancak çıkış bağımsız değişkenleri olarak alınan tutmaçlar ve bellek örnekleri, otomatik oluşturulan kod tarafından otomatik olarak kopyalanır ve işlem tamamlandığında düzgün şekilde kapatılmalıdır. Bu, döndürülen bağımsız değişkenlerin yöntemin dönüş değerleri olarak (tek dönüş değeri durumunda) veya eşzamanlı geri çağırma stili kullanılarak (birden çok dönüş değeri durumunda) görünmesi durumunda geçerlidir.
Ç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, vektörler ise ArrayList<T>
olarak çevrilir. Burada T, uygun nesne türüdür (ör. vec<int32_t> =>
ArrayList<Integer>
gibi skaler türleri sarmalayabilir). Ö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 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ına sahip olur (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
içinde) bulunur.