انواع داده ها

با توجه به یک فایل رابط 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 تبدیل می شوند. علاوه بر این، یک String نباید هنگام ارسال به HIDL تهی باشد.

دسته و حافظه

اندروید 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) زندگی می کند.