ধারণা

তুমি শুরু করার আগে

এই গাইডটি অনুমান করে যে আপনি ইতিমধ্যেই নেটিভ প্রোগ্রামিং এবং অ্যান্ড্রয়েড ডেভেলপমেন্টের অন্তর্নিহিত ধারণাগুলির সাথে পরিচিত৷

ভূমিকা

এই বিভাগটি NDK কীভাবে কাজ করে তার একটি উচ্চ-স্তরের ব্যাখ্যা প্রদান করে। অ্যান্ড্রয়েড এনডিকে হল এমন একটি টুলের সেট যা আপনাকে আপনার অ্যান্ড্রয়েড অ্যাপে C বা C++ ("নেটিভ কোড") এম্বেড করতে দেয়। অ্যান্ড্রয়েড অ্যাপে নেটিভ কোড ব্যবহার করার ক্ষমতা বিশেষ করে ডেভেলপারদের জন্য উপযোগী হতে পারে যারা নিম্নলিখিতগুলির মধ্যে এক বা একাধিক করতে চান:

  • প্ল্যাটফর্মের মধ্যে তাদের অ্যাপ পোর্ট করুন।
  • বিদ্যমান লাইব্রেরি পুনঃব্যবহার করুন, অথবা পুনঃব্যবহারের জন্য তাদের নিজস্ব লাইব্রেরি প্রদান করুন।
  • কিছু ক্ষেত্রে পারফরম্যান্স বাড়ান, বিশেষ করে কম্পিউটেশনাল ইনটেনসিভ গেমগুলির মতো।

কিভাবে এটা কাজ করে

এই বিভাগটি Android এর জন্য একটি নেটিভ অ্যাপ্লিকেশন তৈরিতে ব্যবহৃত প্রধান উপাদানগুলির সাথে পরিচয় করিয়ে দেয় এবং বিল্ডিং এবং প্যাকেজিংয়ের প্রক্রিয়া বর্ণনা করে।

প্রধান উপাদান

আপনি যখন আপনার অ্যাপটি তৈরি করবেন তখন আপনার নিম্নলিখিত উপাদানগুলি সম্পর্কে ধারণা থাকা উচিত:

  • নেটিভ শেয়ার করা লাইব্রেরি: NDK আপনার C/C++ সোর্স কোড থেকে এই লাইব্রেরি বা .so ফাইলগুলি তৈরি করে।

  • নেটিভ স্ট্যাটিক লাইব্রেরি: NDK স্ট্যাটিক লাইব্রেরি বা .a ফাইলও তৈরি করতে পারে, যা আপনি অন্য লাইব্রেরিতে লিঙ্ক করতে পারেন।

  • জাভা নেটিভ ইন্টারফেস (JNI): JNI হল সেই ইন্টারফেস যার মাধ্যমে Java এবং C++ উপাদান একে অপরের সাথে কথা বলে। এই নির্দেশিকা জেএনআই সম্পর্কে জ্ঞান গ্রহণ করে; এটি সম্পর্কে তথ্যের জন্য, জাভা নেটিভ ইন্টারফেস স্পেসিফিকেশন দেখুন।

  • অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI): ABI ঠিক কীভাবে আপনার অ্যাপের মেশিন কোড রানটাইমে সিস্টেমের সাথে ইন্টারঅ্যাক্ট করবে বলে আশা করা হয়। এনডিকে এই সংজ্ঞাগুলির বিরুদ্ধে .so ফাইল তৈরি করে। বিভিন্ন এবিআই বিভিন্ন আর্কিটেকচারের সাথে মিলে যায়: NDK 32-বিট ARM, AArch64, x86, এবং x86-64-এর জন্য ABI সমর্থন অন্তর্ভুক্ত করে। আরও তথ্যের জন্য, Android ABIs দেখুন।

  • ম্যানিফেস্ট: আপনি যদি কোনো জাভা কম্পোনেন্ট ছাড়াই কোনো অ্যাপ লিখছেন, তাহলে আপনাকে অবশ্যই ম্যানিফেস্টে NativeActivity ক্লাস ঘোষণা করতে হবে। এটি কিভাবে করতে হয় তার আরো বিস্তারিত জানার জন্য native_activity.h ইন্টারফেস ব্যবহার করুন দেখুন।

প্রবাহ

অ্যান্ড্রয়েডের জন্য একটি নেটিভ অ্যাপ তৈরির সাধারণ প্রবাহ নিম্নরূপ:

  1. জাভাতে কোন অংশগুলি প্রয়োগ করতে হবে এবং কোন অংশগুলিকে নেটিভ কোড হিসাবে প্রয়োগ করতে হবে তা নির্ধারণ করে আপনার অ্যাপটি ডিজাইন করুন।

  2. একটি অ্যান্ড্রয়েড অ্যাপ প্রোজেক্ট তৈরি করুন যেভাবে আপনি অন্য কোনও অ্যান্ড্রয়েড প্রোজেক্টের জন্য করবেন।

  3. আপনি যদি একটি নেটিভ-অনলি অ্যাপ লিখছেন, তাহলে AndroidManifest.xmlNativeActivity ক্লাস ঘোষণা করুন। আরও তথ্যের জন্য, নেটিভ কার্যকলাপ এবং অ্যাপ্লিকেশন দেখুন।

  4. নাম, পতাকা, লিঙ্ক করা লাইব্রেরি এবং "JNI" ডিরেক্টরিতে কম্পাইল করা সোর্স ফাইল সহ নেটিভ লাইব্রেরি বর্ণনা করে একটি Android.mk ফাইল তৈরি করুন।

  5. ঐচ্ছিকভাবে, আপনি লক্ষ্য ABIs, টুলচেইন, রিলিজ/ডিবাগ মোড এবং STL কনফিগার করে একটি Application.mk ফাইল তৈরি করতে পারেন। আপনি নির্দিষ্ট করেননি এমন যে কোনোটির জন্য, যথাক্রমে নিম্নলিখিত ডিফল্ট মানগুলি ব্যবহার করা হয়:

    • ABI: সমস্ত অ-বঞ্চিত ABI
    • মোড: মুক্তি
    • STL: সিস্টেম
  6. প্রকল্পের jni ডিরেক্টরির অধীনে আপনার স্থানীয় উত্স রাখুন।

  7. নেটিভ ( .so , .a ) লাইব্রেরি কম্পাইল করতে ndk-build ব্যবহার করুন।

  8. জাভা কম্পোনেন্ট তৈরি করুন, এক্সিকিউটেবল .dex ফাইল তৈরি করুন।

  9. আপনার অ্যাপ চালানোর জন্য প্রয়োজনীয় .so , .dex এবং অন্যান্য ফাইল সমন্বিত একটি APK ফাইলে সবকিছু প্যাকেজ করুন।

নেটিভ কার্যকলাপ এবং অ্যাপ্লিকেশন

Android SDK একটি সহায়ক শ্রেণী, NativeActivity প্রদান করে, যা আপনাকে একটি সম্পূর্ণ নেটিভ অ্যাক্টিভিটি লিখতে দেয়। NativeActivity অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এবং আপনার নেটিভ কোডের মধ্যে যোগাযোগ পরিচালনা করে, তাই আপনাকে এটিকে সাবক্লাস করতে হবে না বা এর পদ্ধতিগুলিকে কল করতে হবে না। আপনাকে যা করতে হবে তা হল আপনার AndroidManifest.xml ফাইলে আপনার অ্যাপ্লিকেশনটি নেটিভ হওয়ার ঘোষণা করুন এবং আপনার নেটিভ অ্যাপ্লিকেশন তৈরি করা শুরু করুন৷

NativeActivity ব্যবহার করে একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন এখনও তার নিজস্ব ভার্চুয়াল মেশিনে চলে, অন্যান্য অ্যাপ্লিকেশন থেকে স্যান্ডবক্স করা। তাই আপনি এখনও JNI এর মাধ্যমে Android ফ্রেমওয়ার্ক API অ্যাক্সেস করতে পারেন। কিছু ক্ষেত্রে, যেমন সেন্সর, ইনপুট ইভেন্ট এবং সম্পদের জন্য, NDK নেটিভ ইন্টারফেস প্রদান করে যা আপনি JNI জুড়ে কল করার পরিবর্তে ব্যবহার করতে পারেন। এই ধরনের সমর্থন সম্পর্কে আরও তথ্যের জন্য, নেটিভ API দেখুন।

আপনি একটি নেটিভ অ্যাক্টিভিটি ডেভেলপ করছেন বা না করছেন তা নির্বিশেষে, আমরা আপনাকে প্রথাগত Android বিল্ড টুল দিয়ে আপনার প্রোজেক্ট তৈরি করার পরামর্শ দিই। এটি করা সঠিক কাঠামোর সাথে অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির বিল্ডিং এবং প্যাকেজিং নিশ্চিত করতে সহায়তা করে৷

আপনার নেটিভ কার্যকলাপ বাস্তবায়নের জন্য Android NDK আপনাকে দুটি পছন্দ প্রদান করে:

  • native_activity.h হেডার NativeActivity ক্লাসের নেটিভ সংস্করণকে সংজ্ঞায়িত করে। এটিতে কলব্যাক ইন্টারফেস এবং ডেটা স্ট্রাকচার রয়েছে যা আপনাকে আপনার নেটিভ অ্যাক্টিভিটি তৈরি করতে হবে। যেহেতু আপনার অ্যাপ্লিকেশনের মূল থ্রেড কলব্যাকগুলি পরিচালনা করে, আপনার কলব্যাক বাস্তবায়ন অবশ্যই ব্লক করা উচিত নয়৷ যদি তারা ব্লক করে, আপনি ANR (অ্যাপ্লিকেশন নট রেসপন্ডিং) ত্রুটি পেতে পারেন কারণ কলব্যাক ফিরে না আসা পর্যন্ত আপনার মূল থ্রেডটি প্রতিক্রিয়াশীল নয়।
  • android_native_app_glue.h ফাইলটি স্থানীয়_activity.h ইন্টারফেসের উপরে নির্মিত একটি স্ট্যাটিক হেল্পার লাইব্রেরি সংজ্ঞায়িত করে। এটি অন্য একটি থ্রেড তৈরি করে, যা একটি ইভেন্ট লুপে কলব্যাক বা ইনপুট ইভেন্টের মতো জিনিসগুলি পরিচালনা করে। এই ইভেন্টগুলিকে একটি পৃথক থ্রেডে স্থানান্তর করা আপনার মূল থ্রেডকে ব্লক করা থেকে যেকোনো কলব্যাককে বাধা দেয়।

<ndk_root>/sources/android/native_app_glue/android_native_app_glue.c উৎসটিও উপলব্ধ, যা আপনাকে বাস্তবায়ন পরিবর্তন করতে দেয়।

এই স্ট্যাটিক লাইব্রেরিটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য, নেটিভ-অ্যাক্টিভিটি নমুনা অ্যাপ্লিকেশন এবং এর ডকুমেন্টেশন পরীক্ষা করুন। আরও পড়া <ndk_root>/sources/android/native_app_glue/android_native_app_glue.h ফাইলের মন্তব্যগুলিতেও উপলব্ধ।

native_activity.h ইন্টারফেস ব্যবহার করুন

native_activity.h ইন্টারফেসের সাথে একটি নেটিভ কার্যকলাপ বাস্তবায়ন করতে:

  1. আপনার প্রকল্পের রুট ডিরেক্টরিতে একটি jni/ ডিরেক্টরি তৈরি করুন। এই ডিরেক্টরিটি আপনার সমস্ত নেটিভ কোড সঞ্চয় করে।

  2. AndroidManifest.xml ফাইলে আপনার নেটিভ অ্যাক্টিভিটি ঘোষণা করুন।

    যেহেতু আপনার অ্যাপ্লিকেশনে কোনো জাভা কোড নেই, তাই android:hasCode false এ সেট করুন।

    <application android:label="@string/app_name" android:hasCode="false">
    

    আপনাকে অবশ্যই NativeActivity- তে কার্যকলাপ ট্যাগের android:name বৈশিষ্ট্য সেট করতে হবে।

    <activity android:name="android.app.NativeActivity"
              android:label="@string/app_name">
    

    meta-data ট্যাগের android:value অ্যাট্রিবিউট শেয়ার করা লাইব্রেরির নাম উল্লেখ করে যাতে অ্যাপ্লিকেশনটিতে এন্ট্রি পয়েন্ট থাকে (যেমন C/C++ main ), লাইব্রেরির নাম থেকে lib উপসর্গ এবং .so প্রত্যয় বাদ দিয়ে।

    <manifest>
      <application>
        <activity>
          <meta-data android:name="android.app.lib_name"
                     android:value="native-activity" />
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
        </activity>
      </application>
    </manifest>
    
  3. আপনার নেটিভ অ্যাক্টিভিটির জন্য একটি ফাইল তৈরি করুন এবং ANativeActivity_onCreate ভেরিয়েবলে নাম দেওয়া ফাংশনটি বাস্তবায়ন করুন। নেটিভ অ্যাক্টিভিটি শুরু হলে অ্যাপটি এই ফাংশনটিকে কল করে। এই ফাংশনটি, C/C++ এ main সাথে সাদৃশ্যপূর্ণ, একটি ANativeActivity কাঠামোর একটি পয়েন্টার পায়, যেটিতে বিভিন্ন কলব্যাক বাস্তবায়নের ফাংশন পয়েন্টার রয়েছে যা আপনাকে লিখতে হবে। প্রযোজ্য কলব্যাক ফাংশন পয়েন্টার সেট করুন ANativeActivity->callbacks আপনার কলব্যাক বাস্তবায়নে।

  4. আপনি ব্যবহার করতে চান এমন নির্দিষ্ট ডেটার যেকোন উদাহরণের ঠিকানায় ANativeActivity->instance ক্ষেত্র সেট করুন।

  5. আপনি আপনার কার্যকলাপ শুরু করার পরে করতে চান যে অন্য কিছু বাস্তবায়ন করুন.

  6. আপনি ANativeActivity->callbacks সেট করা বাকি কলব্যাকগুলি প্রয়োগ করুন৷ কলব্যাকগুলি কখন কল করা হয় সে সম্পর্কে আরও তথ্যের জন্য, অ্যাক্টিভিটি লাইফসাইকেল পরিচালনা দেখুন।

  7. আপনার আবেদনের বাকি বিকাশ করুন।

  8. বিল্ড সিস্টেমে আপনার নেটিভ মডিউল বর্ণনা করতে আপনার প্রকল্পের jni/ ডিরেক্টরিতে একটি Android.mk file তৈরি করুন। আরও তথ্যের জন্য, Android.mk দেখুন।

  9. একবার আপনার একটি Android.mk ফাইল হয়ে গেলে, ndk-build কমান্ড ব্যবহার করে আপনার নেটিভ কোড কম্পাইল করুন।

    cd <path>/<to>/<project>
    $NDK/ndk-build
    
  10. যথারীতি আপনার অ্যান্ড্রয়েড প্রকল্প তৈরি এবং ইনস্টল করুন। যদি আপনার নেটিভ কোড jni/ ডিরেক্টরিতে থাকে, তাহলে বিল্ড স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে .so ফাইল(গুলি) থেকে তৈরি করা APK-এ প্যাকেজ করে।

অতিরিক্ত নমুনা কোড

NDK নমুনা ডাউনলোড করতে, NDK নমুনা দেখুন।