با توجه به یک فایل رابط HIDL، باطن Java HIDL رابط های جاوا، Stub و کدهای پروکسی را تولید می کند. از همه انواع HIDL اسکالر ([ u
] int
{ 8,16,32,64}_t, float, double,
and enum
s) و همچنین رشته ها، رابط ها، انواع safe_union، انواع ساختار، و آرایه ها و بردارهای پشتیبانی شده پشتیبانی می کند. انواع HIDL پشتیبان Java HIDL از انواع اتحادیه یا انواع fmq پشتیبانی نمی کند . اندروید 11 پشتیبانی از انواع memory
و handle
را اضافه می کند.
از آنجایی که زمان اجرا جاوا مفهوم اعداد صحیح بدون علامت را به صورت بومی پشتیبانی نمی کند، همه انواع بدون علامت (و enum های مبتنی بر آنها) در سکوت به عنوان معادل های امضا شده خود در نظر گرفته می شوند، یعنی uint32_t
به یک int
در رابط جاوا تبدیل می شود. هیچ تبدیل ارزشی انجام نمی شود. پیادهکننده در سمت جاوا باید از مقادیر امضا شده استفاده کند که انگار بدون علامت هستند.
Enums
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 تبدیل می شود. علاوه بر این، وقتی به HIDL منتقل می شود، String
نباید تهی باشد.
دسته و حافظه
اندروید 11 پشتیبانی جاوا را برای انواع handle
و memory
معرفی می کند. آنها به ترتیب به android.os.NativeHandle
و android.os.HidlMemory
ترجمه می شوند. یک دسته تهی معتبر در نظر گرفته می شود، در حالی که یک حافظه تهی معتبر نیست.
در کد سرور تولید شده، آرگومان های حافظه دریافتی و دسته تنها در محدوده فراخوانی متد معتبر هستند. اگر اجرای سرور بخواهد طول عمر آنها را افزایش دهد، باید با استفاده از متدهای 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 { }; ... };
تعریف باز در یک کلاس درونی ایستا از Bar (در Bar.java
) زندگی می کند.