أنواع البيانات

بناءً على ملف واجهة HIDL، تنشئ الواجهة الخلفية لـ Java HIDL واجهات Java، Stub ورمز الخادم الوكيل. وهي متوافقة مع جميع أنواع HIDL ([u]int{8,16,32,64}_t, float, double, و enum)، بالإضافة إلى السلاسل والواجهات وأنواع Safe_union وهيكل. والصفائف والمتجهات لأنواع HIDL المتوافقة. خلفية Java HIDL لا يتيح استخدام أنواع الاتحاد أو أنواع fmq. جهاز Android 11 يتيح استخدام memory handle نوعًا.

نظرًا لأن وقت تشغيل Java لا يدعم مفهوم الأعداد الصحيحة غير الموقعة في الأصل، يتم التعامل مع جميع الأنواع غير الموقعة (والتعدادات المستندة إليها) بدون تنبيه على أنها مكافئة بعلامة، أي يصبح uint32_t int في واجهة Java. لا يتم إجراء إحالة ناجحة للقيمة؛ المُنفِّذ على يجب أن يستخدم جانب Java القيم المُوقَّعة كما لو كانت غير موقعة.

تعدادات

لا تنشئ التعدادات فئات تعداد Java، ولكن تتم ترجمتها إلى مساحات داخلية الفئات التي تحتوي على تعريف ثابت ثابت لكل حالة تعداد. إذا كان التعداد مشتقة من فئة تعداد أخرى، فإنها تكتسب نوع تخزين تلك الفئة. تتم إعادة كتابة عمليات التعداد المستندة إلى نوع عدد صحيح غير موقَّع بصيغتها الموقَّعة. مماثلة. ونظرًا لأن النوع الأساسي هو نوع أولي، فإن القيمة الافتراضية تكون قيمة حقول/متغيرات التعداد صفرًا حتى في حال عدم وجود تعداد صفري.

على سبيل المثال، 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 في Java هو utf-8 أو utf-16 ولكن يتم تحويلها إلى utf-8 كنوع HIDL الشائعة عند نقلها. بالإضافة إلى ذلك، String يجب ألا تكون فارغة عند إدخالها في HIDL.

الاسم المعرِّف والذاكرة

يتيح نظام التشغيل Android 11 استخدام Java لكل من handle memory نوعًا. مترجَمة إلى android.os.NativeHandle و android.os.HidlMemory، على التوالي. يُعدّ الاسم المعرِّف الفارغ صالحًا، في حين أنّ القيمة الخالية ذاكرة التخزين المؤقت.

في رمز الخادم الذي تم إنشاؤه، تكون وسيطات الذاكرة والأسماء المعرِّفة التي تم استلامها هي فقط صالحة ضمن نطاق طريقة الاستدعاء. فإذا أراد تنفيذ الخادم تمديد المدة، فيجب تكرارها باستخدام طرق dup() التجريبية. تشير رسالة الأشكال البيانية يمكن استخدام المثيل المعروض بخلاف طريقة الاستدعاء ويجب إغلاقه بشكلٍ صحيح عند الانتهاء معهم.

في رمز العميل الذي تم إنشاؤه، الأسماء المعرِّفة ومثيلات الذاكرة التي مُرسل كوسيطات إدخال للطريقة المُستخدمة لا يلزم تكرارها أو الاحتفاظ بها صالحة بعد إرجاع الطريقة. ومع ذلك، فإن الأسماء المعرِّفة ومثيلات الذاكرة التي مستلم كوسيطات الإخراج يتم تكرارها تلقائيًا بواسطة الذي تم إنشاؤه تلقائيًا، ويجب إغلاقه بشكل صحيح عند الانتهاء منه. يكون ذلك صحيحًا سواء كان ذلك ظهور الوسيطات كقيم إرجاع للطريقة (في حالة القيمة المعروضة الفردية) أو باستخدام نمط معاودة الاتصال المتزامن (المستخدم في حالة القيمة المعروضة المتعددة).

لمزيد من المعلومات حول التكرار والإغلاق، راجع وثائق فئات Java.

المصفوفات والمتجهات

تتم ترجمة المصفوفات إلى صفائف Java وتتم ترجمة المتجهات إلى 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();

البُنى

تتم ترجمة الهياكل إلى فئات Java بتنسيق مماثل. بالنسبة مثال:

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 الخاص به. (كما هو مطلوب من Java). على سبيل المثال، ما يلي ينتج عن ملف types.hal ملفان إضافيان يتم إنشاؤهما (Foo.java. وBar.java):

struct Foo {
 ...
};

struct Bar {
 ...

 struct Baz {
 };

 ...
};

يوجد تعريف Baz في فئة داخلية ثابتة من Bar (في Bar.java).