डेटा प्रकार

एक HIDL इंटरफ़ेस फ़ाइल को देखते हुए, Java HIDL बैकएंड जावा इंटरफ़ेस, स्टब और प्रॉक्सी कोड उत्पन्न करता है। यह सभी स्केलर HIDL प्रकारों ([ u ] int { 8,16,32,64}_t, float, double, और enum s) का समर्थन करता है, साथ ही स्ट्रिंग्स, इंटरफेस, सेफ_यूनियन प्रकार, स्ट्रक्चर प्रकार, और सरणियों और समर्थित वैक्टरों का भी समर्थन करता है। एचआईडीएल प्रकार। जावा एचआईडीएल बैकएंड यूनियन प्रकार या एफएमक्यू प्रकार का समर्थन नहीं करता है । एंड्रॉइड 11 memory और handle प्रकारों के लिए समर्थन जोड़ता है।

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

एनम्स

एनम जावा एनम कक्षाएं उत्पन्न नहीं करते हैं, बल्कि प्रत्येक एनम मामले के लिए स्थिर स्थिर परिभाषा वाले आंतरिक कक्षाओं में अनुवादित होते हैं। यदि एनम क्लास किसी अन्य एनम क्लास से प्राप्त होता है, तो यह उस क्लास के भंडारण प्रकार को प्राप्त करता है। अहस्ताक्षरित पूर्णांक प्रकार पर आधारित गणनाओं को उनके हस्ताक्षरित समकक्ष में फिर से लिखा जाता है। चूंकि अंतर्निहित प्रकार एक आदिम है, इसलिए शून्य गणनाकर्ता न होने पर भी एनम फ़ील्ड/चर के लिए डिफ़ॉल्ट मान शून्य है।

उदाहरण के लिए, uint8_t प्रकार वाला एक SomeBaseEnum :

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 हैं लेकिन परिवहन किए जाने पर सामान्य HIDL प्रकार के रूप में utf-8 में परिवर्तित हो जाती हैं। इसके अतिरिक्त, HIDL में पारित होने पर एक String शून्य नहीं होनी चाहिए।

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

एंड्रॉइड 11 handle और memory प्रकारों के लिए जावा समर्थन पेश करता है। इन्हें क्रमशः android.os.NativeHandle और android.os.HidlMemory में अनुवादित किया गया है। एक शून्य हैंडल को वैध माना जाता है, जबकि एक शून्य मेमोरी को नहीं।

जेनरेट किए गए सर्वर कोड में, प्राप्त मेमोरी और हैंडल तर्क केवल विधि आमंत्रण के दायरे में मान्य हैं। यदि सर्वर कार्यान्वयन अपना जीवनकाल बढ़ाना चाहता है, तो उन्हें संबंधित dup() विधियों का उपयोग करके डुप्लिकेट किया जाना चाहिए। लौटाए गए उदाहरण का उपयोग विधि मंगलाचरण से परे किया जा सकता है और पूरा होने पर इसे उचित रूप से बंद किया जाना चाहिए।

जेनरेट किए गए क्लाइंट कोड में, हैंडल और मेमोरी इंस्टेंसेस जिन्हें कॉल की गई विधि के इनपुट तर्क के रूप में भेजा जाता है, उन्हें विधि के वापस आने के बाद डुप्लिकेट करने की आवश्यकता नहीं होती है और न ही वैध रखा जाता है। हालाँकि, आउटपुट तर्क के रूप में प्राप्त होने वाले हैंडल और मेमोरी इंस्टेंस स्वचालित रूप से ऑटोजेनरेटेड कोड द्वारा डुप्लिकेट किए जाते हैं और पूरा होने पर उन्हें ठीक से बंद किया जाना चाहिए। यह सच है कि क्या वे रिटर्न तर्क विधि के रिटर्न मान के रूप में दिखाई देते हैं (एकल रिटर्न वैल्यू मामले में) या सिंक्रोनस कॉलबैक शैली का उपयोग करते हुए (एकाधिक रिटर्न वैल्यू मामले में उपयोग किया जाता है)।

दोहराव और समापन के बारे में अधिक जानकारी के लिए, जावा कक्षाओं के दस्तावेज़ देखें।

सरणियाँ और वैक्टर

Arrays को Java arrays में अनुवादित किया जाता है और वैक्टर को 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 {
 };

 ...
};

बाज़ की परिभाषा बार (बार.जावा में) के एक स्थिर आंतरिक वर्ग में रहती है।