با دریافت یک فایل رابط HIDL، بکاند جاوا HIDL رابطهای جاوا، کد Stub و Proxy را تولید میکند. این بکاند از تمام انواع اسکالر HIDL ([ u ] int { 8,16,32,64}_t, float, double, و enum s) و همچنین رشتهها، رابطها، انواع safe_union، انواع struct و آرایهها و بردارهای انواع HIDL پشتیبانی میکند. بکاند جاوا HIDL از انواع union یا انواع fmq پشتیبانی نمیکند . اندروید ۱۱ پشتیبانی از انواع memory و handle را اضافه کرده است.
از آنجایی که زمان اجرای جاوا به طور طبیعی از مفهوم اعداد صحیح بدون علامت پشتیبانی نمیکند، تمام انواع بدون علامت (و enum های مبتنی بر آنها) به طور نامحسوس به عنوان معادلهای علامتدار خود در نظر گرفته میشوند، یعنی uint32_t در رابط جاوا به یک int تبدیل میشود. هیچ تبدیل مقداری انجام نمیشود؛ پیادهسازیکننده در سمت جاوا باید از مقادیر علامتدار طوری استفاده کند که گویی بدون علامت هستند.
انومها
Enumها کلاسهای enum جاوا تولید نمیکنند، بلکه به کلاسهای داخلی ترجمه میشوند که شامل یک تعریف ثابت استاتیک برای هر مورد enum هستند. اگر کلاس enum از کلاس enum دیگری مشتق شود، نوع ذخیرهسازی آن کلاس را به ارث میبرد. Enumهای مبتنی بر یک نوع عدد صحیح بدون علامت به معادل علامتدار خود بازنویسی میشوند. از آنجایی که نوع اصلی یک نوع اولیه است، مقدار پیشفرض برای فیلدها/متغیرهای enum حتی زمانی که شمارشگر صفر وجود ندارد، صفر است.
برای مثال، یک SomeBaseEnum با نوع uint8_t :
enum SomeBaseEnum : uint8_t { foo = 3 }; enum SomeEnum : SomeBaseEnum { quux = 33, goober = 127 };
... میشود:
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; }
و:
enum SomeEnum : uint8_t { FIRST_CASE = 10, SECOND_CASE = 192 };
... به صورت زیر بازنویسی میشود:
public final class SomeEnum { static public final byte FIRST_CASE = 10; // no change static public final byte SECOND_CASE = -64; }
رشتهها
String در جاوا utf-8 یا utf-16 است اما هنگام انتقال به utf-8 به عنوان نوع رایج HIDL تبدیل میشود. علاوه بر این، String هنگام ارسال به HIDL نباید تهی (null) باشد.
دسته و حافظه
اندروید ۱۱ پشتیبانی جاوا را برای انواع handle و memory معرفی میکند. این دو نوع به ترتیب به android.os.NativeHandle و android.os.HidlMemory ترجمه میشوند. یک handle تهی معتبر در نظر گرفته میشود، در حالی که یک memory تهی معتبر نیست.
در کد تولید شده توسط سرور ، آرگومانهای حافظه و هندل دریافتی فقط در محدوده فراخوانی متد معتبر هستند. اگر پیادهسازی سرور بخواهد طول عمر آنها را افزایش دهد، باید با استفاده از متدهای dup() مربوط به آنها کپی شوند. نمونه برگردانده شده میتواند فراتر از فراخوانی متد مورد استفاده قرار گیرد و پس از اتمام کار، باید به درستی بسته شود.
در کد کلاینت تولید شده، نیازی نیست که دستگیرهها و نمونههای حافظه که به عنوان آرگومانهای ورودی متد فراخوانی شده ارسال میشوند، پس از بازگشت متد، کپی شوند و معتبر نگه داشته شوند. با این حال، دستگیرهها و نمونههای حافظه که به عنوان آرگومانهای خروجی دریافت میشوند، به طور خودکار توسط کد تولید شده خودکار کپی میشوند و پس از اتمام کار باید به درستی بسته شوند. این موضوع چه آن آرگومانهای بازگشتی به عنوان مقادیر بازگشتی متد (در حالت مقدار بازگشتی تکی) ظاهر شوند و چه با استفاده از سبک فراخوانی همزمان (در حالت مقدار بازگشتی چندگانه) اعمال شود، صادق است.
برای اطلاعات بیشتر در مورد تکثیر و بستن، به مستندات کلاسهای جاوا مراجعه کنید.
آرایهها و بردارها
آرایهها به آرایههای جاوا و بردارها به ArrayList<T> ترجمه میشوند که در آن T نوع شیء مناسب است و احتمالاً انواع اسکالر مانند vec<int32_t> => ArrayList<Integer> را در بر میگیرد. برای مثال:
takeAnArray(int32_t[3] array); returnAVector() generates (vec<int32_t> result);
... میشود:
void takeAnArray(int[] array); ArrayList<Integer> returnAVector();
سازهها
ساختارها با طرحبندی مشابهی به کلاسهای جاوا تبدیل میشوند. برای مثال:
struct Bar { vec<bool> someBools; }; struct Foo { int32_t a; int8_t b; float[10] c; Bar d; };
... میشود:
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(); }
انواع اعلام شده
هر نوع سطح بالا که در types.hal تعریف شده باشد، فایل خروجی .java مخصوص به خود را دریافت میکند (مطابق با الزامات جاوا). برای مثال، فایل types.hal زیر منجر به ایجاد دو فایل اضافی میشود (Foo.java و Bar.java):
struct Foo { ... }; struct Bar { ... struct Baz { }; ... };
تعریف Baz در یک کلاس داخلی استاتیک به نام Bar (در Bar.java ) قرار دارد.