एनडीके को अन्य बिल्ड सिस्टम के साथ इस्तेमाल करना

NDK में ndk-build और CMake के लिए आधिकारिक सहायता उपलब्ध है. ज़्यादातर उपयोगकर्ताओं को यह करना चाहिए ऐप्लिकेशन कोड बनाने के बारे में जानकारी देने वाली गाइड देखें. इसका मकसद इस दस्तावेज़ में बताया गया है कि किसी अन्य बिल्ड का इस्तेमाल करने वाले मौजूदा कोड को कैसे बनाया जाए सिस्टम. तीसरे पक्ष की ऐसी डिपेंडेंसी के मामले में अक्सर ऐसा होता है खास तौर पर Android के लिए, जैसे कि TSV और libbzip2.

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

खास जानकारी

एनडीके में क्लैंग कंपाइलर को सिर्फ़ कम से कम कॉन्फ़िगरेशन के साथ इस्तेमाल किया जा सकता है अपने टारगेट एनवायरमेंट को तय करना ज़रूरी है.

यह पक्का करने के लिए कि आप सही आर्किटेक्चर के लिए बिल्ड करें, ज़रूरी शर्तें पूरी करें Clang का इस्तेमाल करते समय -target के साथ टारगेट करें. उदाहरण के लिए, 64-बिट के लिए कंपाइल करने के लिए Android 21 के minSdkVersion के साथ ARM में काम करता है, इसके लिए ये काम करें:

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
    --target aarch64-linux-android21 foo.cpp

इसके अलावा, Clang के लिए टारगेट-प्रीफ़िक्स्ड एंट्री-पॉइंट मौजूद हैं. ये या तो सिमलिंक या स्क्रिप्ट जो एनडीके रिलीज़ के आधार पर क्लैंग पर फ़ॉरवर्ड की जाती हैं और होस्ट ओएस. --target के साथ सीधे Clang का इस्तेमाल करना ज़्यादा भरोसेमंद होगा. ऐसा इसलिए, क्योंकि यह सबसे जांचा गया वर्कफ़्लो है. साथ ही, कभी-कभी आर्ग्युमेंट फ़ॉरवर्ड करने की सुविधा का इस्तेमाल किया जाता है रिकॉर्ड करते हैं. Windows पर, फ़ॉरवर्ड करने के लिए अतिरिक्त CreateProcess की ज़रूरत होती है स्क्रिप्ट से वास्तविक कंपाइलर तक इससे बिल्ड की स्पीड पर बुरा असर पड़ सकता है.

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
    foo.cpp

दोनों मामलों में, $NDK को एनडीके (NDK) और $HOST_TAG के पाथ से बदलें, ताकि यह मैच हो सके नीचे दी गई टेबल के मुताबिक, आपने जो एनडीके डाउनलोड किया है:

NDK ओएस वैरिएंट होस्ट टैग
macOS darwin-x86_64
Linux linux-x86_64
64-बिट Windows windows-x86_64

यहां प्रीफ़िक्स या टारगेट आर्ग्युमेंट का फ़ॉर्मैट, minSdkVersion को दिखाने वाला सफ़िक्स. इस सफ़िक्स का इस्तेमाल सिर्फ़ इनके साथ किया जाता है clang/clang++; binutils टूल (जैसे कि ar और strip) के लिए, प्रत्यय है, क्योंकि उन पर minSdkVersion का कोई असर नहीं होता. Android पर काम करता है लक्ष्य ट्रिपल इस प्रकार हैं:

ABI ट्रिपल
Armeabi-v7a armv7a-linux-androideabi
आर्म64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android

कई प्रोजेक्ट का बिल्ड स्क्रिप्ट जीसीसी-स्टाइल क्रॉस कंपाइलर की मदद से काम करेगा, जहां हर कंपाइलर सिर्फ़ एक ओएस/आर्किटेक्चर कॉम्बिनेशन को टारगेट करता है. इसलिए, हो सकता है कि वह हैंडल न कर पाए -target क्लीनिंग. इन मामलों में, आम तौर पर -target को शामिल किया जा सकता है कंपाइलर की परिभाषा के हिस्से के रूप में तर्क दें (जैसे, CC="clang -target aarch64-linux-android21). बहुत कम मामलों में ऐसा होता है कि बिल्ड सिस्टम का इस्तेमाल किया जा रहा है अगर आपको इस फ़ॉर्म का इस्तेमाल नहीं करना है, तो तीन प्रीफ़िक्स वाली क्लैंग बाइनरी का इस्तेमाल करें.

ऑटो-कॉन्फ़्रेंस

ऑटो-कॉन्फ़्रेंस प्रोजेक्ट की मदद से, एनवायरमेंट के साथ इस्तेमाल करने के लिए टूलचेन तय की जा सकती है वैरिएबल. उदाहरण के लिए, Android के लिए libpng बनाने का तरीका नीचे बताया गया है Linux पर, एपीआई लेवल 21 के minSdkVersion के साथ x86-64.

# Check out the source.
git clone https://github.com/glennrp/libpng -b v1.6.37
cd libpng
# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android
# Set this to your minSdkVersion.
export API=21
# Configure and build.
export AR=$TOOLCHAIN/bin/llvm-ar
export CC="$TOOLCHAIN/bin/clang --target=$TARGET$API"
export AS=$CC
export CXX="$TOOLCHAIN/bin/clang++ --target=$TARGET$API"
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
./configure --host $TARGET
make

इस सैंपल में चुने गए टूल, NDK r22 और इसके बाद के वर्शन के लिए सही हैं. पुराने एनडीके हो सकता है कि अलग-अलग टूल की ज़रूरत पड़े.

ऐसे प्रोजेक्ट बनाएं जो ऑटो-कॉन्फ़्रेंस न हों

कुछ मेकफ़ाइल प्रोजेक्ट एक जैसे वैरिएबल को बदलकर, क्रॉस कंपाइलेशन की अनुमति देते हैं ऐसा ऑटो-कॉन्फ़्रेंस प्रोजेक्ट में किया जा सकता है. उदाहरण के लिए, नीचे दिए गए उदाहरण से पता चलता है कि Android x86-64 के लिए, 21 के minSdkVersion के साथ libbzip2 बनाने के लिए.

# Check out the source.
git clone https://gitlab.com/bzip/bzip2.git
cd bzip2

# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android

# Set this to your minSdkVersion.
export API=21

# Build.
make \
    CC="$TOOLCHAIN/bin/clang --target=$TARGET$API" \
    AR=$TOOLCHAIN/bin/llvm-ar \
    RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
    bzip2

इस सैंपल में चुने गए टूल, NDK r22 और इसके बाद के वर्शन के लिए सही हैं. पुराने एनडीके हो सकता है कि अलग-अलग टूल की ज़रूरत पड़े.