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