डेटा टाइप

किसी एचआईडीएल इंटरफ़ेस फ़ाइल के लिए, Java HIDL बैकएंड, Java इंटरफ़ेस, स्टब, और प्रॉक्सी कोड जनरेट करता है. यह स्केलर HIDL टाइप के साथ-साथ, स्ट्रिंग, इंटरफ़ेस, सुरक्षित यूनियन टाइप, स्ट्रक्चर टाइप, और काम करने वाले HIDL टाइप के ऐरे और वैक्टर के साथ काम करता है([u]int{8,16,32,64}_t, float, double, और enums). Java HIDL बैकएंड, यूनियन टाइप या fmq टाइप के साथ काम नहीं करता. Android 11 में memory और handle टाइप के लिए सहायता जोड़ी गई है.

Java रनटाइम, बिना साइन वाले पूर्णांक के कॉन्सेप्ट को मूल रूप से काम नहीं करता.इसलिए, बिना साइन वाले सभी टाइप (और उन पर आधारित एनम) को साइन वाले टाइप के बराबर माना जाता है. इसका मतलब है कि Java इंटरफ़ेस में uint32_t, int बन जाता है. कोई वैल्यू कन्वर्ज़न नहीं किया जाता; Java साइड पर लागू करने वाले को, हस्ताक्षर वाली वैल्यू का इस्तेमाल ऐसे करना चाहिए जैसे कि उन पर हस्ताक्षर न किया गया हो.

Enums

एनम, Java एनम क्लास जनरेट नहीं करते. इसके बजाय, इन्हें इनर क्लास में बदल दिया जाता है. इन क्लास में, हर एनम केस के लिए स्टैटिक कॉन्स्टेंट की परिभाषा होती है. अगर 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;
}

स्ट्रिंग

Java में String, utf-8 या utf-16 होता है. हालांकि, इसे ट्रांसपोर्ट करते समय, सामान्य HIDL टाइप के तौर पर utf-8 में बदल दिया जाता है. इसके अलावा, एचआईडीएल में पास करते समय String को शून्य नहीं होना चाहिए.

हैंडल और मेमोरी

Android 11 में, handle और memory टाइप के लिए Java की सुविधा जोड़ी गई है. इनका अनुवाद, android.os.NativeHandle और android.os.HidlMemory में किया जाता है. कोई भी हैंडल मान्य माना जाता है, जबकि कोई भी मेमोरी अमान्य होती है.

जनरेट किए गए server कोड में, मिली मेमोरी और हैंडल आर्ग्युमेंट सिर्फ़, मेथड को कॉल करने के दायरे में मान्य होते हैं. अगर सर्वर को अपने लाइफ़टाइम को बढ़ाना है, तो 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 में).