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