তথ্যের ধরণ

একটি HIDL ইন্টারফেস ফাইল দেওয়া হলে, জাভা HIDL ব্যাকএন্ড জাভা ইন্টারফেস, স্টাব এবং প্রক্সি কোড তৈরি করে। এটি সমস্ত স্কেলার HIDL প্রকারগুলিকে সমর্থন করে ([ u ] int { 8,16,32,64}_t, float, double, and enum s), পাশাপাশি স্ট্রিং, ইন্টারফেস, safe_union প্রকার, struct প্রকার এবং সমর্থিত অ্যারে এবং ভেক্টর HIDL প্রকার। জাভা HIDL ব্যাকএন্ড ইউনিয়ন প্রকার বা fmq প্রকার সমর্থন করে না । Android 11 memory এবং handle প্রকারের জন্য সমর্থন যোগ করে।

যেহেতু জাভা রানটাইম অস্বাক্ষরিত পূর্ণসংখ্যার ধারণাটিকে স্থানীয়ভাবে সমর্থন করে না, তাই সমস্ত স্বাক্ষরবিহীন প্রকারগুলি (এবং তাদের উপর ভিত্তি করে এনামগুলি) নীরবে তাদের স্বাক্ষরিত সমতুল্য হিসাবে বিবেচিত হয়, যেমন uint32_t জাভা ইন্টারফেসে একটি int হয়ে যায়। কোন মান রূপান্তর সঞ্চালিত হয় না; জাভা পাশের বাস্তবায়নকারীকে অবশ্যই স্বাক্ষরিত মানগুলি ব্যবহার করতে হবে যেন তারা স্বাক্ষরবিহীন।

এনামস

Enums জাভা enum ক্লাস তৈরি করে না বরং প্রতিটি 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;
}

স্ট্রিংস

জাভাতে String হল utf-8 বা utf-16 কিন্তু পরিবহনের সময় সাধারণ HIDL টাইপ হিসাবে utf-8 তে রূপান্তরিত হয়। উপরন্তু, HIDL এ পাস করার সময় একটি String শূন্য হওয়া উচিত নয়।

হ্যান্ডেল এবং মেমরি

অ্যান্ড্রয়েড 11 handle এবং memory প্রকারের জন্য জাভা সমর্থন প্রবর্তন করে। এগুলি যথাক্রমে android.os.NativeHandle এবং android.os.HidlMemory এ অনুবাদ করা হয়েছে৷ একটি নাল হ্যান্ডেল বৈধ বলে বিবেচিত হয়, যখন একটি নাল মেমরি নয়।

জেনারেট করা সার্ভার কোডে, প্রাপ্ত মেমরি এবং হ্যান্ডেল আর্গুমেন্ট শুধুমাত্র পদ্ধতি আহ্বানের সুযোগের মধ্যেই বৈধ। যদি সার্ভার বাস্তবায়ন তাদের জীবনকাল বাড়াতে চায়, তাহলে তাদের অবশ্যই তাদের resepective dup() পদ্ধতি ব্যবহার করে ডুপ্লিকেট করতে হবে। প্রত্যাবর্তিত উদাহরণটি পদ্ধতি আহ্বানের বাইরে ব্যবহার করা যেতে পারে এবং এটি সম্পন্ন করার সময় সঠিকভাবে বন্ধ করা উচিত।

জেনারেট করা ক্লায়েন্ট কোডে, হ্যান্ডেল এবং মেমরি ইনস্ট্যান্স যা কল করা পদ্ধতির ইনপুট আর্গুমেন্ট হিসাবে পাঠানো হয় সেগুলি নকল করার দরকার নেই বা পদ্ধতিটি ফিরে আসার পরে বৈধ রাখা হবে না। যাইহোক, আউটপুট আর্গুমেন্ট হিসাবে প্রাপ্ত হ্যান্ডেল এবং মেমরির দৃষ্টান্তগুলি স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে জেনারেটেড কোড দ্বারা সদৃশ হয় এবং যখন এটি করা হয় তখন অবশ্যই সঠিকভাবে বন্ধ করতে হবে। এই রিটার্ন আর্গুমেন্টগুলি পদ্ধতির রিটার্ন মান হিসাবে (একক রিটার্ন মানের ক্ষেত্রে) বা সিঙ্ক্রোনাস কলব্যাক স্টাইল ব্যবহার করে (একাধিক রিটার্ন মান ক্ষেত্রে ব্যবহৃত হয়) এটি সত্য।

ডুপ্লিকেশন এবং ক্লোজিং সম্পর্কে আরও তথ্যের জন্য, জাভা ক্লাসের ডকুমেন্টেশন দেখুন।

অ্যারে এবং ভেক্টর

অ্যারেগুলিকে জাভা অ্যারেতে অনুবাদ করা হয় এবং ভেক্টরগুলিকে 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 {
 };

 ...
};

বাজ-এর সংজ্ঞা বারের একটি স্থির অভ্যন্তরীণ শ্রেণীতে বাস করে (Bar.java-এ)।