ডেটা প্রকার

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

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

এনাম

Enum-গুলো জাভা enum ক্লাস তৈরি করে না, বরং প্রতিটি enum কেসের জন্য একটি স্ট্যাটিক কনস্ট্যান্ট ডেফিনিশন ধারণকারী ইনার ক্লাসে রূপান্তরিত হয়। যদি enum ক্লাসটি অন্য কোনো enum ক্লাস থেকে উদ্ভূত হয়, তবে এটি সেই ক্লাসের স্টোরেজ টাইপ উত্তরাধিকার সূত্রে পায়। একটি আনসাইনড ইন্টিজার টাইপের উপর ভিত্তি করে তৈরি এনুমারেশনগুলোকে তাদের সাইনড সমতুল্যে পুনরায় লেখা হয়। যেহেতু অন্তর্নিহিত টাইপটি একটি প্রিমিটিভ, তাই কোনো জিরো এনুমেটর না থাকলেও enum ফিল্ড/ভেরিয়েবলের ডিফল্ট মান শূন্য হয়।

উদাহরণস্বরূপ, 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 অবশ্যই null হবে না।

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

অ্যান্ড্রয়েড ১১-এ handle এবং memory টাইপের জন্য জাভা সাপোর্ট চালু করা হয়েছে। এগুলিকে যথাক্রমে android.os.NativeHandle এবং android.os.HidlMemory তে রূপান্তর করা হয়েছে। একটি null handle বৈধ বলে বিবেচিত হয়, কিন্তু একটি null memory বৈধ নয়।

জেনারেট করা সার্ভার কোডে, প্রাপ্ত মেমরি এবং হ্যান্ডেল আর্গুমেন্টগুলো শুধুমাত্র মেথড আহ্বানের আওতার মধ্যেই বৈধ থাকে। সার্ভার ইমপ্লিমেন্টেশন যদি এগুলোর মেয়াদ বাড়াতে চায়, তবে সেগুলোকে অবশ্যই তাদের নিজ নিজ 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 {
 };

 ...
};

Baz-এর সংজ্ঞাটি Bar নামক একটি স্ট্যাটিক ইনার ক্লাসে ( Bar.java ফাইলে) থাকে।