CMake की सुविधा कॉन्फ़िगर करें

CMake बिल्ड स्क्रिप्ट एक सादा टेक्स्ट फ़ाइल होती है, जिसे आपको नाम देना होगा CMakeLists.txt और इसमें ऐसे निर्देश शामिल होते हैं जिनका इस्तेमाल CMake करता है. इसकी मदद से, C/C++ लाइब्रेरी. अगर आपके नेटिव सोर्स में पहले से CMake बिल्ड नहीं है स्क्रिप्ट के लिए, आपको खुद ही एक स्क्रिप्ट बनानी होगी और सही CMake को शामिल करना होगा निर्देश देखें. CMake की सुविधा को इंस्टॉल करने का तरीका जानने के लिए, NDK ऐप्लिकेशन इंस्टॉल और कॉन्फ़िगर करें और CMake शामिल हैं.

इस सेक्शन में कुछ बुनियादी निर्देशों के बारे में बताया गया है, जिन्हें आपको अपने बिल्ड में शामिल करना चाहिए इससे CMake को यह बताया जा सकता है कि अपनी नेटिव प्रॉपर्टी बनाते समय किन सोर्स का इस्तेमाल करना है लाइब्रेरी. ज़्यादा जानने के लिए, CMake कमांड से जुड़े आधिकारिक दस्तावेज़ पढ़ें.

नई CMake बिल्ड स्क्रिप्ट कॉन्फ़िगर करने के बाद, आपको Gredle को कॉन्फ़िगर करें C Maker प्रोजेक्ट को बिल्ड डिपेंडेंसी के तौर पर शामिल करने की कोशिश की जाती है. इससे Gradle बिल्ड और आपकी स्थानीय लाइब्रेरी को आपके ऐप्लिकेशन के APK से पैकेज करता है.

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

CMake बिल्ड स्क्रिप्ट बनाएं

ऐसी सादा टेक्स्ट फ़ाइल बनाने के लिए जिसका इस्तेमाल CMake बिल्ड स्क्रिप्ट के तौर पर किया जा सकता है, इस तरह आगे बढ़ें:

  1. IDE की बाईं ओर से प्रोजेक्ट पैनल खोलें और ड्रॉप-डाउन मेन्यू से प्रोजेक्ट व्यू.
  2. your-module की रूट डायरेक्ट्री पर राइट क्लिक करें और नया > चुनें फ़ाइल.

    ध्यान दें: बिल्ड स्क्रिप्ट को अपनी पसंद की किसी भी जगह पर बनाया जा सकता है. हालांकि, बिल्ड स्क्रिप्ट कॉन्फ़िगर करते समय, आपके नेटिव सोर्स का पाथ फ़ाइलें और लाइब्रेरी, बिल्ड स्क्रिप्ट की जगह पर निर्भर करती हैं.

  3. "CMakeLists.txt" डालें को फ़ाइल नाम के रूप में और OK पर क्लिक करें.

अब CMake कमांड जोड़कर, अपनी बिल्ड स्क्रिप्ट को कॉन्फ़िगर किया जा सकता है. निर्देश देने के लिए नेटिव सोर्स कोड से नेटिव लाइब्रेरी बनाने के लिए CMake के अपनी बिल्ड स्क्रिप्ट में cmake_minimum_required() और add_library() निर्देश जोड़ें:

# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add_library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )

सलाह: जैसे ही CMake की मदद से नेटिव लाइब्रेरी बनाई जा सकती है सोर्स फ़ाइलों को अपडेट किया है, तो आप इनका इस्तेमाल कर सकते हैं: add_executable() कमांड देकर, CMake को निर्देश दें कि वह इसके बजाय उन सोर्स फ़ाइलों से एक्ज़ीक्यूट किया जा सकता है. हालांकि, अपने ब्राउज़र से एक्ज़ीक्यूटेबल बनाना नेटिव सोर्स का इस्तेमाल करना ज़रूरी नहीं है. साथ ही, अपनी लाइब्रेरी में नेटिव लाइब्रेरी बनाकर APK, प्रोजेक्ट से जुड़ी ज़्यादातर ज़रूरी शर्तों को पूरा करता है.

जब CMake बिल्ड स्क्रिप्ट में सोर्स फ़ाइल या लाइब्रेरी को जोड़ा जाता है, तो add_library(), Android Studio में इससे जुड़ी हेडर फ़ाइलें भी दिखती हैं प्रोजेक्ट सिंक करने के बाद, प्रोजेक्ट व्यू में दिखेगा. हालांकि, कंपाइल करने के दौरान आपकी हेडर फ़ाइलें खोजने के लिए CMake के लिए ऑर्डर करना होगा, तो आपको अपने CMake की सुविधा में include_directories() निर्देश जोड़ें स्क्रिप्ट बनाएं और अपने हेडर का पाथ बताएं:

add_library(...)

# Specifies a path to native header files.
include_directories(src/main/cpp/include/)

CMake की शर्तों के मुताबिक आपकी लाइब्रेरी की फ़ाइल को नाम दिया जाता है. इसका तरीका यहां बताया गया है:

liblibrary-name.so

उदाहरण के लिए, अगर "Native-lib" तय किया जाता है जैसे कि आपकी शेयर की गई लाइब्रेरी बिल्ड स्क्रिप्ट में, CMake a फ़ाइल बनाता है. libnative-lib.so. हालांकि, इस लाइब्रेरी को अपने Java या Kotlin कोड, CMake बिल्ड स्क्रिप्ट में बताए गए नाम का इस्तेमाल करें:

Kotlin

companion object {
    init {
        System.loadLibrary("native-lib");
    }
}

Java

static {
    System.loadLibrary("native-lib");
}

ध्यान दें: अगर CMake बिल्ड में किसी लाइब्रेरी का नाम बदला जाता है या उसे हटाया जाता है स्क्रिप्ट, तो Gradle में बदलाव लागू करने से पहले आपको अपने प्रोजेक्ट को साफ़ करना होगा या यह लाइब्रेरी के पुराने वर्शन को आपके APK से हटा देता है. अपने प्रोजेक्ट के लिए, बिल्ड > मेन्यू बार से प्रोजेक्ट मिटाएं पर क्लिक करें.

Android Studio, सोर्स फ़ाइलें और हेडर अपने-आप cpp ग्रुप को प्रोजेक्ट पैनल में देखें. इस्तेमाल करके कई add_library() निर्देश हैं, तो आप अतिरिक्त अन्य सोर्स फ़ाइलों से बनाने के लिए CMake के लिए लाइब्रेरी.

NDK एपीआई जोड़ें

Android NDK, नेटिव एपीआई और लाइब्रेरी का एक सेट उपलब्ध कराता है, जो आपको मिल सकता है उपयोगी. अपने प्रोजेक्ट में एनडीके लाइब्रेरी को शामिल करके, इनमें से किसी भी एपीआई का इस्तेमाल किया जा सकता है CMakeLists.txt स्क्रिप्ट फ़ाइल.

पहले से बनी एनडीके लाइब्रेरी पहले से ही Android प्लैटफ़ॉर्म पर मौजूद होती हैं. इसलिए, आपको आपको उन्हें बनाना होगा या उन्हें अपने APK में पैकेज करना होगा. क्योंकि एनडीके लाइब्रेरी CMake के खोज पाथ का हिस्सा हैं, तो आपको यह तय करने की ज़रूरत नहीं है कि आपके स्थानीय एनडीके (एनडीके) इंस्टॉलेशन में लाइब्रेरी की जगह—आपको सिर्फ़ CMake की उस लाइब्रेरी का नाम बताएं जिसका आपको इस्तेमाल करना है और उसे जोड़ें करने के लिए किया जा सकता है.

अपने CMake बिल्ड में find_library() कमांड जोड़ें स्क्रिप्ट का इस्तेमाल करके, NDK लाइब्रेरी का पता लगाया जाता है और उसके पाथ को वैरिएबल के तौर पर सेव किया जाता है. आप उपयोग करते हैं यह वैरिएबल बिल्ड स्क्रिप्ट के अन्य हिस्सों में एनडीके (NDK) लाइब्रेरी को रेफ़र करता है. नीचे दिया गया सैंपल, Android के लिए खास तौर पर बनाई गई लॉग सहायता लाइब्रेरी का पता लगाता है और log-lib में इसका पाथ सेव करता है:

find_library( # Defines the name of the path variable that stores the
              # location of the NDK library.
              log-lib

              # Specifies the name of the NDK library that
              # CMake needs to locate.
              log )

आपकी स्थानीय लाइब्रेरी, ताकि log में फ़ंक्शन को कॉल किया जा सके लाइब्रेरी के लिए, आपको target_link_libraries() कमांड का उपयोग करके लाइब्रेरी को आपकी CMake बिल्ड स्क्रिप्ट:

find_library(...)

# Links your native library against one or more other native libraries.
target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the log library to the target library.
                       ${log-lib} )

एनडीके में सोर्स कोड के तौर पर कुछ लाइब्रेरी भी शामिल होती हैं, जिन्हें आपको बनाने की ज़रूरत होती है और अपनी स्थानीय लाइब्रेरी से लिंक करें. आप सोर्स कोड को अपने CMake में add_library() निर्देश का इस्तेमाल करके नेटिव लाइब्रेरी बिल्ड स्क्रिप्ट. अपनी स्थानीय एनडीके लाइब्रेरी का पाथ उपलब्ध कराने के लिए, ANDROID_NDK पाथ वैरिएबल, जो Android Studio में अपने-आप लागू होता है तय करता है.

नीचे दिया गया निर्देश, CMake को android_native_app_glue.c, जो NativeActivity को मैनेज करता है एक स्टैटिक लाइब्रेरी में लाइफ़साइकल इवेंट और टच इनपुट को जोड़कर, उसे native-lib:

add_library( app-glue
             STATIC
             ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )

# You need to link static libraries against your shared native library.
target_link_libraries( native-lib app-glue ${log-lib} )

पहले से बनी अन्य लाइब्रेरी जोड़ना

पहले से बनी लाइब्रेरी जोड़ना, बनाने के लिए CMake का इस्तेमाल करें. हालांकि, लाइब्रेरी पहले से ही बनाई गई है, इसलिए आपको IMPORTED फ़्लैग का इस्तेमाल करके, CMakeer से यह बताएं कि अपने प्रोजेक्ट में सिर्फ़ लाइब्रेरी इंपोर्ट करना चाहते हैं:

add_library( imported-lib
             SHARED
             IMPORTED )

इसके बाद आपको इसका उपयोग करके लाइब्रेरी का पथ दर्ज करना होगा set_target_properties() निर्देश इस तौर पर: नीचे दी गई जानकारी देखें.

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

add_library(...)
set_target_properties( # Specifies the target library.
                       imported-lib

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       imported-lib/src/${ANDROID_ABI}/libimported-lib.so )

कंपाइल टाइम के दौरान अपनी हेडर फ़ाइलों का पता लगाने के लिए CMake के लिए आपको include_directories() कमांड और अपने हेडर फ़ाइलें:

include_directories( imported-lib/include/ )

ध्यान दें: अगर आपको पहले से बनी किसी ऐसी लाइब्रेरी को पैकेज करना है जो बिल्ड-टाइम डिपेंडेंसी—उदाहरण के लिए, जब पहले से बनी कोई ऐसी लाइब्रेरी जोड़ी जाती है जो imported-lib की निर्भरता, आपको पर क्लिक करें.

पहले से बनी लाइब्रेरी को अपनी स्थानीय लाइब्रेरी से लिंक करने के लिए, इसे आपकी CMake बिल्ड स्क्रिप्ट में target_link_libraries() कमांड:

target_link_libraries( native-lib imported-lib app-glue ${log-lib} )

पहले से बनी लाइब्रेरी को अपने APK में पैकेज करने के लिए, आपको ये काम करने होंगे मैन्युअल तौर पर Gradle को sourceSets ब्लॉक के साथ कॉन्फ़िगर करें: अपनी .so फ़ाइल का पाथ शामिल करें. अपना APK बनाने के बाद, आपको यह पुष्टि कर सकता है कि किन लाइब्रेरी Gradle पैकेज को आपके APK में जोड़ा गया है. इसके लिए APK ऐनालाइज़र.

अन्य CMake प्रोजेक्ट शामिल करें

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

# Sets lib_src_DIR to the path of the target CMake project.
set( lib_src_DIR ../gmath )

# Sets lib_build_DIR to the path of the desired output directory.
set( lib_build_DIR ../gmath/outputs )
file(MAKE_DIRECTORY ${lib_build_DIR})

# Adds the CMakeLists.txt file located in the specified directory
# as a build dependency.
add_subdirectory( # Specifies the directory of the CMakeLists.txt file.
                  ${lib_src_DIR}

                  # Specifies the directory for the build outputs.
                  ${lib_build_DIR} )

# Adds the output of the additional CMake build as a prebuilt static
# library and names it lib_gmath.
add_library( lib_gmath STATIC IMPORTED )
set_target_properties( lib_gmath PROPERTIES IMPORTED_LOCATION
                       ${lib_build_DIR}/${ANDROID_ABI}/lib_gmath.a )
include_directories( ${lib_src_DIR}/include )

# Links the top-level CMake build output against lib_gmath.
target_link_libraries( native-lib ... lib_gmath )

कमांड लाइन से CMake को कॉल करना

इसके बाहर निंजा प्रोजेक्ट जनरेट करने के लिए, CMake को कॉल करने के लिए नीचे दिए गए निर्देश का इस्तेमाल करें Android Studio में जाकर:

cmake
-Hpath/to/cmakelists/folder
-Bpath/to/generated/ninja/project/debug/ABI
-DANDROID_ABI=ABI                               // For example, arm64-v8a
-DANDROID_PLATFORM=platform-version-string      // For example, android-16
-DANDROID_NDK=android-sdk/ndk/ndk-version
-DCMAKE_TOOLCHAIN_FILE=android-sdk/ndk/ndk-version/build/cmake/android.toolchain.cmake
-G Ninja

यह निर्देश निंजा प्रोजेक्ट बनाएगा, जिसे बनाने के लिए इस्तेमाल किया जा सकता है Android की एक्ज़ीक्यूटेबल लाइब्रेरी (.so फ़ाइलें). CMAKE_TOOLCHAIN_FILE यह है को NDK के CMake समर्थन का इस्तेमाल करना ज़रूरी है. CMake 3.21 या बाद के वर्शन के लिए, CMake का बिल्ट-इन इसके बजाय, एनडीके (NDK) सहायता का इस्तेमाल किया जा सकता है. हालांकि, वैरिएबल के किसी दूसरे ग्रुप का इस्तेमाल करना ज़रूरी है जैसा कि CMake के Android के लिए क्रॉस कंपाइलिंग दस्तावेज़ में बताया गया है.