Gradle को अपनी निजी लाइब्रेरी से लिंक करें

अपनी नेटिव लाइब्रेरी प्रोजेक्ट को Gradle बिल्ड डिपेंडेंसी के तौर पर शामिल करने के लिए, आपको इन चीज़ों की ज़रूरत होगी Gradle को अपनी CMake या ndk-build स्क्रिप्ट फ़ाइल का पाथ उपलब्ध कराएं. टास्क कब शुरू होगा आपका ऐप्लिकेशन बनाया जाता है, Gradle, CMake या ndk-build चलाता है, और पैकेज शेयर करता है लाइब्रेरी के साथ काम करता है. Gradle, बिल्ड स्क्रिप्ट का इस्तेमाल यह जानने के लिए भी करता है कि कौनसी फ़ाइलें प्रोजेक्ट पर वापस ले जाया जा सकता है, ताकि उन्हें यहां से ऐक्सेस किया जा सके प्रोजेक्ट विंडो. अगर आपके पास अपने नेटिव एपीआई के लिए कोई बिल्ड स्क्रिप्ट नहीं है स्रोतों के लिए, आपको एक ऐसा बनाना होगा आगे बढ़ने से पहले, CMake बिल्ड स्क्रिप्ट बनाएं.

आपके Android प्रोजेक्ट का हर मॉड्यूल सिर्फ़ एक CMake या ndk-build से लिंक कर सकता है स्क्रिप्ट फ़ाइल. उदाहरण के लिए, अगर आपको किसी सोर्स से आउटपुट एक से ज़्यादा CMake प्रोजेक्ट बनाते हैं, तो आपको एक CMakeLists.txt फ़ाइल का इस्तेमाल करना होगा अपने टॉप-लेवल CMake बिल्ड स्क्रिप्ट के तौर पर शामिल करें (जिसके बाद आप Gradle को लिंक करते हैं) और अन्य CMake प्रोजेक्ट जोड़ें उस बिल्ड स्क्रिप्ट की डिपेंडेंसी. इसी तरह, अगर ndk-build का इस्तेमाल किया जा रहा है, आपके टॉप-लेवल में अन्य मेकफ़ाइल शामिल कर सकता है Android.mk स्क्रिप्ट फ़ाइल.

Gradle को किसी नेटिव प्रोजेक्ट से लिंक करने के बाद, Android Studio, अपनी सोर्स फ़ाइलों और नेटिव लाइब्रेरी को दिखाने के लिए प्रोजेक्ट पैनल cpp समूह में और आपके एक्सटर्नल बिल्ड स्क्रिप्ट में External Build Files ग्रुप.

ध्यान दें: Gradle कॉन्फ़िगरेशन में बदलाव करते समय, पक्का करें कि प्रोजेक्ट सिंक करें पर क्लिक करके अपने बदलाव लागू करें क्लिक करें. इसके अलावा, अपने CMake या ndk-build में बदलाव करते समय जब आप पहले ही Gradle से लिंक कर लें, तब आपको स्क्रिप्ट फ़ाइल को सिंक करना होगा Android Studio में अपने बदलावों के साथ, बिल्ड > चुनें लिंक किए गए C++ रीफ़्रेश करें प्रोजेक्ट पर क्लिक करें.

आप Android Studio का यूज़र इंटरफ़ेस (यूआई):

  1. IDE की बाईं ओर से प्रोजेक्ट पैनल खोलें और Android व्यू चुनें.
  2. उस मॉड्यूल पर राइट-क्लिक करें जिसे आपको अपनी स्थानीय लाइब्रेरी से लिंक करना है. जैसे कि app मॉड्यूल और Link C++ प्रोजेक्ट चुनें Gradle के साथ कैसे काम करता है. आपको चौथी इमेज में दिखाया गया है.
  3. ड्रॉप-डाउन मेन्यू से, CMake या चुनें ndk-build.
    1. अगर आप CMake चुनते हैं, तो CMakeLists.txt स्क्रिप्ट तय करने के लिए प्रोजेक्ट पाथ फ़ाइल जोड़ें.
    2. अगर ndk-build को चुना जाता है, तो इसके लिए Android.mk स्क्रिप्ट फ़ाइल तय करने के लिए, प्रोजेक्ट पाथ आपका बाहरी ndk-build प्रोजेक्ट, Android Studio में Application.mk फ़ाइल होगी, अगर यह उसी डायरेक्ट्री में मौजूद है, जो Android.mk फ़ाइल.

    चौथी इमेज. किसी बाहरी C++ प्रोजेक्ट को लिंक करने के लिए Android Studio का डायलॉग बॉक्स.

  4. ठीक है पर क्लिक करें.

Gradle को मैन्युअल तरीके से कॉन्फ़िगर करें

अपनी निजी लाइब्रेरी से लिंक करने के लिए, Gradle को मैन्युअल तरीके से कॉन्फ़िगर करने के लिए, आपको नया वर्शन जोड़ना होगा externalNativeBuild आपके मॉड्यूल-लेवल पर ब्लॉक करता है build.gradle फ़ाइल को खोलें और उसे 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"
    }
  }
}

Kotlin

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")
    }
  }
}

ध्यान दें: अगर Gradle को किसी मौजूदा ndk-बिल्ड से लिंक करना है प्रोजेक्ट को कॉपी करने के लिए, के बजाय ndkBuild ब्लॉक करें cmake ब्लॉक करें और अपनी Android.mk फ़ाइल से मिलता-जुलता पाथ दें. Gradle भी इसमें Application.mk फ़ाइल शामिल होती है, अगर यह उसी डायरेक्ट्री में मौजूद है जिसमें आपकी Android.mk फ़ाइल है.

वैकल्पिक कॉन्फ़िगरेशन तय करें

CMake या ndk-build के लिए वैकल्पिक आर्ग्युमेंट और फ़्लैग तय करें किसी और को कॉन्फ़िगर कर रहा है externalNativeBuild ब्लॉक आपके मॉड्यूल-लेवल का defaultConfig ब्लॉक build.gradle फ़ाइल. अन्य प्रॉपर्टी की तरह 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 {...}
  }
}

Kotlin

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 {...}
  }
}

प्रॉडक्ट के फ़्लेवर और वैरिएंट को कॉन्फ़िगर करने के बारे में ज़्यादा जानने के लिए, यहां जाएं बिल्ड वैरिएंट कॉन्फ़िगर करें. इसके लिए उन वैरिएबल की सूची जिन्हें CMake के लिए कॉन्फ़िगर किया जा सकता है. arguments प्रॉपर्टी के लिए, CMake वैरिएबल का इस्तेमाल करना देखें.

पहले से बनी नेटिव लाइब्रेरी शामिल करें

अगर आपको Gradle, पहले से बनी नेटिव लाइब्रेरी को पैकेज करना है, तो इसका इस्तेमाल किसी भी बाहरी नेटिव बिल्ड का इस्तेमाल करके, उन्हें src/main/jniLibs/ABI में जोड़ें यहां आपके मॉड्यूल की डायरेक्ट्री का इस्तेमाल किया जा सकता है.

Android Gradle प्लग इन के 4.0 से पहले के वर्शन ज़रूरी हैं, जिनमें CMake का इस्तेमाल भी शामिल है आपकी jniLibs डायरेक्ट्री में मौजूद IMPORTED टारगेट को, आपकी है. यदि आप प्लग इन के किसी पुराने वर्शन से माइग्रेट कर रहे हैं, तो आप नीचे दी गई गड़बड़ी की तरह कोई गड़बड़ी हुई है:

* 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 प्लग इन 4.0' का इस्तेमाल किया जा रहा है, तो उन सभी लाइब्रेरी को मूव करें जिनका इस्तेमाल किया जा रहा है IMPORTED इस गड़बड़ी से बचने के लिए, अपनी jniLibs डायरेक्ट्री से टारगेट बनाएं.

एबीआई की जानकारी दें

डिफ़ॉल्ट रूप से, Gradle आपकी नेटिव लाइब्रेरी को अलग-अलग .so में बनाता है ऐप्लिकेशन बाइनरी इंटरफ़ेस के लिए फ़ाइलें (एबीआई) एनडीके साथ काम करता है और उन्हें आपके ऐप्लिकेशन में पैकेज कर देता है. अगर आपको Gradle, ताकि आपके नेटिव विज्ञापन के सिर्फ़ कुछ एबीआई कॉन्फ़िगरेशन को बनाया और पैकेज किया जा सके लाइब्रेरी हैं, तो आप उन्हें ndk.abiFilters फ़्लैग को अपने मॉड्यूल-लेवल की build.gradle फ़ाइल में फ़्लैग करें, जैसा कि नीचे दिखाया गया है:

ग्रूवी

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 {...}
}

Kotlin

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 {...}
}

ज़्यादातर मामलों में, आपको केवल abiFilters को ndk ब्लॉक, जैसा कि ऊपर दिखाया गया है, क्योंकि यह Gradle को दोनों बिल्ड के लिए कहता है और अपनी स्थानीय लाइब्रेरी के उन वर्शन को पैकेज करें. हालांकि, अगर आपको यह कंट्रोल करें कि Gradle को क्या बनाना चाहिए, अलग से यह कि आपको क्या बनाना है तो कोई दूसरा abiFilters फ़्लैग कॉन्फ़िगर करें. defaultConfig.externalNativeBuild.cmake ब्लॉक (या defaultConfig.externalNativeBuild.ndkBuild ब्लॉक). ग्रेडल ये एबीआई कॉन्फ़िगरेशन बनाता है, लेकिन सिर्फ़ वही कॉन्फ़िगरेशन पैकेज करता है जिन्हें आपने defaultConfig.ndk ब्लॉक.

हमारा सुझाव है कि आप ऐप्लिकेशन को पब्लिश करने के लिए, 'Android ऐप्लिकेशन बंडल' फ़ॉर्मैट का इस्तेमाल करें. इससे, आपके ऐप्लिकेशन का साइज़, क्योंकि सिर्फ़ उपयोगकर्ता की एबीआई से मेल खाने वाली नेटिव लाइब्रेरी डाउनलोड के साथ ही डिवाइस डिलीवर हो जाएगा.

अगस्त 2021 से पहले बनाए गए APKs का इस्तेमाल करके पब्लिश करने वाले लेगसी ऐप्लिकेशन के लिए, इस पर विचार करें कॉन्फ़िगर हो रहा है एबीआई पर आधारित कई APK—न कि एक बड़ा APK बनाने के बजाय आपकी नेटिव लाइब्रेरी के वर्शन के मामले में, Gradle, हर एबीआई के लिए अलग-अलग APK बनाता है की मदद से, सिर्फ़ उन फ़ाइलों को पैकेज किया जा सकता है जिनकी हर एबीआई को ज़रूरत है. अगर आपको प्रति एबीआई के लिए कई APK कॉन्फ़िगर करें abiFilters फ़्लैग, जैसा कि ऊपर दिए गए कोड सैंपल में दिखाया गया है, Gradle बिल्ड आपकी स्थानीय लाइब्रेरी के ऐसे सभी एबीआई वर्शन जो इस पर काम करते हैं, लेकिन सिर्फ़ उन्हें जिन्हें आप अपने एक से ज़्यादा APK कॉन्फ़िगरेशन में तय करते हैं. के वर्शन बनाने से बचने के लिए जो आपकी नेटिव लाइब्रेरी नहीं हैं, उनके लिए एबीआई की वही सूची दें abiFilters फ़्लैग और आपके हर एबीआई के एक से ज़्यादा APK, दोनों कॉन्फ़िगरेशन.