HIDL इंटरफ़ेस फ़ाइल मिलने पर, Java HIDL बैकएंड, Java इंटरफ़ेस जनरेट करता है,
स्टब और प्रॉक्सी कोड. यह सभी अदिश एचआईडीएल टाइप के साथ काम करता है
([u
]int
{8,16,32,64}_t, float, double,
और
enum
s), साथ ही स्ट्रिंग, इंटरफ़ेस, Safe_union टाइप, स्ट्रक्चर
और समर्थित HIDL प्रकारों के प्रकार, और सरणियां और वेक्टर. Java HIDL बैकएंड, यूनियन टाइप या fmq टाइप के साथ काम नहीं करता. Android 11 में memory
और handle
टाइप के लिए सहायता जोड़ी गई है.
Java रनटाइम, बिना साइन वाले पूर्णांक के कॉन्सेप्ट के साथ काम नहीं करता. इसलिए, बिना साइन वाले सभी टाइप (और उन पर आधारित एनम) को साइन वाले टाइप के बराबर माना जाता है. इसका मतलब है कि Java इंटरफ़ेस में uint32_t
, int
बन जाता है. कोई वैल्यू कन्वर्ज़न नहीं किया जाता; Java साइड पर लागू करने वाले को, हस्ताक्षर वाली वैल्यू का इस्तेमाल ऐसे करना चाहिए जैसे कि उन पर हस्ताक्षर न किया गया हो.
इनम्स
Enums Java 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; }
स्ट्रिंग
Java में String
, utf-8 या utf-16 होता है. हालांकि, इसे ट्रांसपोर्ट करते समय, सामान्य HIDL टाइप के तौर पर utf-8 में बदल दिया जाता है. इसके अलावा, String
HIDL में पास किए जाने पर शून्य नहीं होना चाहिए.
हैंडल और मेमोरी
Android 11 में लॉन्च किया गया, handle
के लिए Java की सुविधा और
memory
टाइप. इनका अनुवाद, क्रमशः 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.JavaScript):
struct Foo { ... }; struct Bar { ... struct Baz { }; ... };
Baz की परिभाषा, बार की स्टैटिक इनर क्लास (Bar.java
में) में रहती है.