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

بالنظر إلى ملف واجهة HIDL، تقوم الواجهة الخلفية لـ Java HIDL بإنشاء واجهات Java وStub ورمز الوكيل. وهو يدعم جميع أنواع HIDL العددية ([ u ] int { 8,16,32,64}_t, float, double, و enum s)، بالإضافة إلى السلاسل والواجهات وأنواع Safe_union وأنواع البنية والمصفوفات والمتجهات المدعومة. أنواع هيدل. لا تدعم الواجهة الخلفية لـ 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).