আপনার নেটিভ লাইব্রেরিতে Gradle লিঙ্ক করুন

আপনার নেটিভ লাইব্রেরি প্রোজেক্টকে গ্রেডল বিল্ড ডিপেন্ডেন্সি হিসেবে অন্তর্ভুক্ত করতে, আপনাকে আপনার CMake বা ndk-build স্ক্রিপ্ট ফাইলের পাথ দিয়ে Gradle প্রদান করতে হবে। আপনি যখন আপনার অ্যাপ তৈরি করেন, তখন Gradle CMake বা ndk-build চালায় এবং আপনার অ্যাপের সাথে শেয়ার করা লাইব্রেরি প্যাকেজ করে। আপনার অ্যান্ড্রয়েড স্টুডিও প্রকল্পে কোন ফাইলগুলি টানতে হবে তা জানতে গ্রেডল বিল্ড স্ক্রিপ্টও ব্যবহার করে, যাতে আপনি প্রকল্প উইন্ডো থেকে সেগুলি অ্যাক্সেস করতে পারেন। আপনার স্থানীয় উত্সগুলির জন্য যদি আপনার কাছে একটি বিল্ড স্ক্রিপ্ট না থাকে তবে আপনি এগিয়ে যাওয়ার আগে আপনাকে একটি CMake বিল্ড স্ক্রিপ্ট তৈরি করতে হবে৷

আপনার অ্যান্ড্রয়েড প্রকল্পের প্রতিটি মডিউল শুধুমাত্র একটি CMake বা ndk-বিল্ড স্ক্রিপ্ট ফাইলের সাথে লিঙ্ক করতে পারে। সুতরাং, উদাহরণস্বরূপ, আপনি যদি একাধিক CMake প্রকল্প থেকে আউটপুট তৈরি করতে এবং প্যাকেজ করতে চান, তাহলে আপনাকে একটি CMakeLists.txt ফাইল আপনার শীর্ষ-স্তরের CMake বিল্ড স্ক্রিপ্ট হিসাবে ব্যবহার করতে হবে (যার সাথে আপনি Gradle লিঙ্ক করেন) এবং অন্যান্য CMake প্রকল্পগুলিকে নির্ভরতা হিসাবে যুক্ত করতে হবে। যে বিল্ড স্ক্রিপ্ট. একইভাবে, আপনি যদি ndk-build ব্যবহার করেন, আপনি আপনার শীর্ষ-স্তরের Android.mk স্ক্রিপ্ট ফাইলে অন্যান্য Makefiles অন্তর্ভুক্ত করতে পারেন।

একবার আপনি একটি নেটিভ প্রোজেক্টের সাথে Gradle লিঙ্ক করলে, Android Studio আপনার সোর্স ফাইল এবং cpp গ্রুপে নেটিভ লাইব্রেরি এবং এক্সটার্নাল বিল্ড ফাইল গ্রুপে আপনার এক্সটার্নাল বিল্ড স্ক্রিপ্ট দেখানোর জন্য প্রোজেক্ট প্যান আপডেট করে।

দ্রষ্টব্য: গ্রেডল কনফিগারেশনে পরিবর্তন করার সময়, সিঙ্ক প্রজেক্টে ক্লিক করে আপনার পরিবর্তনগুলি প্রয়োগ করতে ভুলবেন না টুলবারে অতিরিক্তভাবে, যখন আপনি আপনার CMake বা ndk-build স্ক্রিপ্ট ফাইলটিকে ইতিমধ্যেই Gradle-এর সাথে লিঙ্ক করার পরে পরিবর্তন করবেন, তখন মেনু বার থেকে Build > Refresh Linked C++ প্রজেক্ট নির্বাচন করে আপনার পরিবর্তনগুলির সাথে Android Studio সিঙ্ক করা উচিত।

আপনি অ্যান্ড্রয়েড স্টুডিও ইউআই ব্যবহার করে একটি বাহ্যিক CMake বা ndk-বিল্ড প্রকল্পের সাথে Gradle লিঙ্ক করতে পারেন:

  1. IDE এর বাম দিক থেকে প্রজেক্ট প্যানটি খুলুন এবং অ্যান্ড্রয়েড ভিউ নির্বাচন করুন।
  2. আপনি যে মডিউলটি আপনার নেটিভ লাইব্রেরির সাথে লিঙ্ক করতে চান, যেমন অ্যাপ মডিউলে ডান-ক্লিক করুন এবং মেনু থেকে Gradle এর সাথে লিঙ্ক C++ প্রজেক্ট নির্বাচন করুন। আপনি চিত্র 4 এ দেখানো ডায়ালগের মতো একটি ডায়ালগ দেখতে পাবেন।
  3. ড্রপ-ডাউন মেনু থেকে, CMake বা ndk-build নির্বাচন করুন।
    1. আপনি যদি CMake নির্বাচন করেন, তাহলে আপনার বাহ্যিক CMake প্রকল্পের জন্য CMakeLists.txt স্ক্রিপ্ট ফাইলটি নির্দিষ্ট করতে প্রজেক্ট পাথের পাশের ক্ষেত্রটি ব্যবহার করুন।
    2. আপনি যদি ndk-build নির্বাচন করেন, তাহলে আপনার বাহ্যিক ndk-build প্রকল্পের জন্য Android.mk স্ক্রিপ্ট ফাইল নির্দিষ্ট করতে প্রজেক্ট পাথের পাশের ক্ষেত্রটি ব্যবহার করুন। অ্যান্ড্রয়েড স্টুডিওতে Application.mk ফাইলও অন্তর্ভুক্ত থাকে যদি এটি আপনার Android.mk ফাইলের মতো একই ডিরেক্টরিতে থাকে।

    চিত্র 4. অ্যান্ড্রয়েড স্টুডিও ডায়ালগ ব্যবহার করে একটি বাহ্যিক C++ প্রকল্প লিঙ্ক করা।

  4. ওকে ক্লিক করুন।

ম্যানুয়ালি Gradle কনফিগার করুন

আপনার নেটিভ লাইব্রেরির সাথে লিঙ্ক করার জন্য গ্রেডলকে ম্যানুয়ালি কনফিগার করতে, আপনাকে আপনার মডিউল-স্তরের build.gradle ফাইলে externalNativeBuild ব্লক যোগ করতে হবে এবং cmake বা ndkBuild ব্লকের সাথে কনফিগার করতে হবে:

গ্রোভি

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }
}

কোটলিন

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path = file("CMakeLists.txt")
    }
  }
}

দ্রষ্টব্য: আপনি যদি একটি বিদ্যমান ndk-build প্রকল্পের সাথে Gradle লিঙ্ক করতে চান, cmake ব্লকের পরিবর্তে ndkBuild ব্লক ব্যবহার করুন এবং আপনার Android.mk ফাইলে একটি আপেক্ষিক পথ প্রদান করুন। Gradle এছাড়াও Application.mk ফাইলটি অন্তর্ভুক্ত করে যদি এটি আপনার Android.mk ফাইলের মতো একই ডিরেক্টরিতে থাকে।

ঐচ্ছিক কনফিগারেশন নির্দিষ্ট করুন

আপনি আপনার মডিউল-স্তরের build.gradle ফাইলের defaultConfig ব্লকের মধ্যে অন্য externalNativeBuild ব্লক কনফিগার করে CMake বা ndk-build-এর জন্য ঐচ্ছিক আর্গুমেন্ট এবং পতাকা নির্দিষ্ট করতে পারেন। defaultConfig ব্লকের অন্যান্য বৈশিষ্ট্যের মতো, আপনি আপনার বিল্ড কনফিগারেশনে প্রতিটি পণ্যের স্বাদের জন্য এই বৈশিষ্ট্যগুলিকে ওভাররাইড করতে পারেন।

উদাহরণস্বরূপ, যদি আপনার CMake বা ndk-build প্রজেক্ট একাধিক নেটিভ লাইব্রেরি এবং এক্সিকিউটেবলকে সংজ্ঞায়িত করে, তাহলে আপনি প্রদত্ত পণ্যের স্বাদের জন্য শুধুমাত্র সেই আর্টিফ্যাক্টগুলির একটি উপসেট তৈরি এবং প্যাকেজ করতে targets সম্পত্তি ব্যবহার করতে পারেন। নিম্নলিখিত কোড নমুনা আপনি কনফিগার করতে পারেন কিছু বৈশিষ্ট্য বর্ণনা করে:

গ্রোভি

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use the ndkBuild block.
      cmake {

        // Passes optional arguments to CMake.
        arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"

        // Sets a flag to enable format macro constants for the C compiler.
        cFlags "-D__STDC_FORMAT_MACROS"

        // Sets optional flags for the C++ compiler.
        cppFlags "-fexceptions", "-frtti"
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    demo {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries or executables to build and package
          // for this product flavor. The following tells Gradle to build only the
          // "native-lib-demo" and "my-executible-demo" outputs from the linked
          // CMake project. If you don't configure this property, Gradle builds all
          // executables and shared object libraries that you define in your CMake
          // (or ndk-build) project. However, by default, Gradle packages only the
          // shared libraries in your app.
          targets "native-lib-demo",
                  // You need to specify this executable and its sources in your CMakeLists.txt
                  // using the add_executable() command. However, building executables from your
                  // native sources is optional, and building native libraries to package into
                  // your app satisfies most project requirements.
                  "my-executible-demo"
        }
      }
    }

    paid {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets "native-lib-paid",
                  "my-executible-paid"
        }
      }
    }
  }

  // Use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}

কোটলিন

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use the ndkBuild block.
      cmake {

        // Passes optional arguments to CMake.
        arguments += listOf("-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang")

        // Sets a flag to enable format macro constants for the C compiler.
        cFlags += listOf("-D__STDC_FORMAT_MACROS")

        // Sets optional flags for the C++ compiler.
        cppFlags += listOf("-fexceptions", "-frtti")
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    create("demo") {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries or executables to build and package
          // for this product flavor. The following tells Gradle to build only the
          // "native-lib-demo" and "my-executible-demo" outputs from the linked
          // CMake project. If you don't configure this property, Gradle builds all
          // executables and shared object libraries that you define in your CMake
          // (or ndk-build) project. However, by default, Gradle packages only the
          // shared libraries in your app.
          targets += listOf("native-lib-demo",
                  // You need to specify this executable and its sources in your CMakeLists.txt
                  // using the add_executable() command. However, building executables from your
                  // native sources is optional, and building native libraries to package into
                  // your app satisfies most project requirements.
                  "my-executible-demo")
        }
      }
    }

    create("paid") {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets += listOf("native-lib-paid",
                  "my-executible-paid")
        }
      }
    }
  }

  // Use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}

পণ্যের ফ্লেভার এবং বিল্ড ভেরিয়েন্ট কনফিগার করার বিষয়ে আরও জানতে, কনফিগার বিল্ড ভেরিয়েন্টে যান। ভেরিয়েবলের একটি তালিকার জন্য আপনি arguments সম্পত্তির সাথে CMake-এর জন্য কনফিগার করতে পারেন, দেখুন CMake ভেরিয়েবল ব্যবহার করা

প্রি-বিল্ট নেটিভ লাইব্রেরি অন্তর্ভুক্ত করুন

আপনি যদি Gradle-কে প্রি-বিল্ট নেটিভ লাইব্রেরি প্যাকেজ করতে চান যেগুলি কোনও বহিরাগত নেটিভ বিল্ডে ব্যবহার করা হয় না, সেগুলিকে আপনার মডিউলের src/main/jniLibs/ ABI ডিরেক্টরিতে যোগ করুন।

আপনার অ্যাপে অন্তর্ভুক্ত করার জন্য আপনার jniLibs ডিরেক্টরিতে CMake IMPORTED টার্গেট সহ 4.0-এর আগের Android Gradle Plugin-এর সংস্করণগুলি প্রয়োজন। আপনি যদি প্লাগইনের পূর্ববর্তী সংস্করণ থেকে স্থানান্তরিত হন তবে আপনি নিম্নলিখিতগুলির মতো একটি ত্রুটির সম্মুখীন হতে পারেন:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

আপনি যদি Android Gradle Plugin 4.0 ব্যবহার করেন, তাহলে এই ত্রুটি এড়াতে আপনার jniLibs ডিরেক্টরি থেকে IMPORTED CMake টার্গেট দ্বারা ব্যবহৃত যেকোন লাইব্রেরি সরিয়ে নিন।

ABIs উল্লেখ করুন

ডিফল্টরূপে, Gradle আপনার নেটিভ লাইব্রেরি আলাদা করে তৈরি করে .so অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABIs)-এর জন্য ফাইলগুলি NDK সমর্থন করে এবং সেগুলিকে আপনার অ্যাপে প্যাকেজ করে। আপনি যদি চান যে Gradle আপনার নেটিভ লাইব্রেরিগুলির শুধুমাত্র কিছু ABI কনফিগারেশন তৈরি এবং প্যাকেজ করুক, আপনি সেগুলিকে আপনার মডিউল-স্তরের build.gradle ফাইলে ndk.abiFilters পতাকা দিয়ে নির্দিষ্ট করতে পারেন, যেমনটি নীচে দেখানো হয়েছে:

গ্রোভি

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      cmake {...}
      // or ndkBuild {...}
    }

    // Similar to other properties in the defaultConfig block,
    // you can configure the ndk block for each product flavor
    // in your build configuration.
    ndk {
      // Specifies the ABI configurations of your native
      // libraries Gradle should build and package with your app.
      abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                   'arm64-v8a'
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}

কোটলিন

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      cmake {...}
      // or ndkBuild {...}
    }

    // Similar to other properties in the defaultConfig block,
    // you can configure the ndk block for each product flavor
    // in your build configuration.
    ndk {
      // Specifies the ABI configurations of your native
      // libraries Gradle should build and package with your app.
      abiFilters += listOf("x86", "x86_64", "armeabi", "armeabi-v7a",
                   "arm64-v8a")
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}

বেশিরভাগ ক্ষেত্রে, উপরে দেখানো হিসাবে আপনাকে শুধুমাত্র ndk ব্লকে abiFilters নির্দিষ্ট করতে হবে, কারণ এটি Gradle কে আপনার নেটিভ লাইব্রেরিগুলির সেই সংস্করণগুলি তৈরি এবং প্যাকেজ করতে বলে। যাইহোক, আপনি যদি আপনার অ্যাপে প্যাকেজ করতে চান তা থেকে স্বাধীনভাবে Gradle কী তৈরি করা উচিত তা নিয়ন্ত্রণ করতে চাইলে, defaultConfig.externalNativeBuild.cmake ব্লকে (বা defaultConfig.externalNativeBuild.ndkBuild ব্লক) অন্য abiFilters পতাকা কনফিগার করুন। Gradle সেই ABI কনফিগারেশনগুলি তৈরি করে কিন্তু শুধুমাত্র সেইগুলিকে প্যাকেজ করে যা আপনি defaultConfig.ndk ব্লকে উল্লেখ করেছেন।

আপনার অ্যাপের আকার আরও কমাতে অ্যান্ড্রয়েড অ্যাপ বান্ডেল ব্যবহার করে প্রকাশ করার পরামর্শ দেওয়া হচ্ছে, কারণ শুধুমাত্র ব্যবহারকারীর ডিভাইসের ABI-এর সাথে মেলে এমন নেটিভ লাইব্রেরিই ডাউনলোডের সাথে বিতরণ করা হবে।

APK ব্যবহার করে লিগ্যাসি অ্যাপ প্রকাশের জন্য (আগস্ট 2021 সালের আগে তৈরি), ABI-এর উপর ভিত্তি করে একাধিক APK কনফিগার করার কথা বিবেচনা করুন — আপনার নেটিভ লাইব্রেরির সমস্ত সংস্করণের সাথে একটি বড় APK তৈরি করার পরিবর্তে, Gradle প্রতিটি ABI-এর জন্য আলাদা APK তৈরি করে যা আপনি সমর্থন করতে চান এবং শুধুমাত্র প্রতিটি ABI এর প্রয়োজনীয় ফাইল প্যাকেজ করে। আপনি যদি উপরের কোড নমুনায় দেখানো abiFilters পতাকা নির্দিষ্ট না করেই ABI প্রতি একাধিক APK কনফিগার করেন, তাহলে Gradle আপনার নেটিভ লাইব্রেরির সমস্ত সমর্থিত ABI সংস্করণ তৈরি করে, কিন্তু শুধুমাত্র আপনার একাধিক APK কনফিগারেশনে নির্দিষ্ট করা প্যাকেজগুলিকে। আপনার নেটিভ লাইব্রেরির ভার্সন তৈরি করা এড়াতে যা আপনি চান না, abiFilters পতাকা এবং আপনার প্রতি-ABI একাধিক APK কনফিগারেশন উভয়ের জন্য ABI-এর একই তালিকা প্রদান করুন।