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 और इसके बाद के वर्शन के लिए सही हैं. पुराने एनडीके हो सकता है कि अलग-अलग टूल की ज़रूरत पड़े.