NDK-এ ndk-build এবং CMake- এর জন্য অফিসিয়াল সমর্থন রয়েছে। বেশিরভাগ ব্যবহারকারীর উচিত অ্যাপ্লিকেশন কোড তৈরির জন্য সেই গাইডগুলির মধ্যে একটি উল্লেখ করা। এই নথির উদ্দেশ্য হল কীভাবে বিদ্যমান কোড তৈরি করা যায় যা অন্যান্য বিল্ড সিস্টেম ব্যবহার করে তা বর্ণনা করা। এটি প্রায়শই তৃতীয় পক্ষের নির্ভরতার ক্ষেত্রে ঘটে যা Android-নির্দিষ্ট নয়, যেমন OpenSSL এবং libbzip2।
বিল্ড সিস্টেম রক্ষণাবেক্ষণকারীরা তাদের বিল্ড সিস্টেমে নেটিভ এনডিকে সমর্থন যোগ করতে চান তাদের পরিবর্তে বিল্ড সিস্টেম রক্ষণাবেক্ষণকারী গাইডটি পড়া উচিত।
ওভারভিউ
এনডিকে-তে ক্ল্যাং কম্পাইলারটি আপনার লক্ষ্য পরিবেশকে সংজ্ঞায়িত করার জন্য প্রয়োজনীয় ন্যূনতম কনফিগারেশনের সাথে ব্যবহারযোগ্য।
আপনি সঠিক আর্কিটেকচারের জন্য তৈরি করেছেন তা নিশ্চিত করতে, Clang আহ্বান করার সময় -target
দিয়ে উপযুক্ত লক্ষ্যটি পাস করুন। উদাহরণস্বরূপ, 21-এর একটি minSdkVersion
সহ 64-বিট ARM অ্যান্ড্রয়েডের জন্য কম্পাইল করতে, নিম্নলিখিতগুলি করুন:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
--target=aarch64-linux-android21 foo.cpp
বিকল্পভাবে, ক্ল্যাং-এর জন্য লক্ষ্য-প্রিফিক্সড এন্ট্রি-পয়েন্ট রয়েছে। NDK রিলিজ এবং হোস্ট OS-এর উপর নির্ভর করে এগুলি হয় সিমলিঙ্ক বা স্ক্রিপ্ট হতে পারে যা ক্ল্যাং-এর দিকে এগিয়ে যায়। --target
এর সাথে সরাসরি ক্ল্যাং-এর আহ্বান করা আরও নির্ভরযোগ্য হবে, কারণ এটিই সবচেয়ে পরীক্ষিত ওয়ার্কফ্লো, এবং স্ক্রিপ্টগুলিতে মাঝে মাঝে আর্গুমেন্ট ফরওয়ার্ডিং বাগ রয়েছে। উইন্ডোজে, স্ক্রিপ্ট থেকে আসল কম্পাইলারে ফরোয়ার্ড করার জন্য অতিরিক্ত CreateProcess
প্রয়োজন বিল্ড স্পিডে একটি লক্ষণীয় নেতিবাচক প্রভাব ফেলতে পারে।
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
foo.cpp
উভয় ক্ষেত্রেই, NDK-এর পথ দিয়ে $NDK
প্রতিস্থাপন করুন এবং নিম্নলিখিত সারণী অনুসারে আপনার ডাউনলোড করা NDK-এর সাথে মেলে $HOST_TAG
:
NDK OS ভেরিয়েন্ট | হোস্ট ট্যাগ |
---|---|
macOS | darwin-x86_64 |
লিনাক্স | linux-x86_64 |
64-বিট উইন্ডোজ | windows-x86_64 |
এখানে উপসর্গ বা লক্ষ্য আর্গুমেন্টের বিন্যাস হল টার্গেট ট্রিপল যার একটি প্রত্যয় minSdkVersion
নির্দেশ করে। এই প্রত্যয়টি শুধুমাত্র clang/clang++ এর সাথে ব্যবহার করা হয়; binutils টুলস (যেমন ar
এবং strip
) একটি প্রত্যয় প্রয়োজন হয় না কারণ তারা minSdkVersion
দ্বারা প্রভাবিত হয় না। অ্যান্ড্রয়েড সমর্থিত টার্গেট ট্রিপল নিম্নরূপ:
এবিআই | ট্রিপল |
---|---|
armeabi-v7a | armv7a-linux-androideabi |
arm64-v8a | aarch64-linux-android |
x86 | i686-linux-android |
x86-64 | x86_64-linux-android |
অনেক প্রকল্পের বিল্ড স্ক্রিপ্ট জিসিসি-স্টাইলের ক্রস কম্পাইলার আশা করবে যেখানে প্রতিটি কম্পাইলার শুধুমাত্র একটি ওএস/আর্কিটেকচার সংমিশ্রণকে লক্ষ্য করে এবং তাই -target
পরিষ্কারভাবে পরিচালনা করতে পারে না। এই ক্ষেত্রে, আপনি সাধারণত কম্পাইলার সংজ্ঞার অংশ হিসাবে -target
আর্গুমেন্ট অন্তর্ভুক্ত করতে পারেন (যেমন CC="clang -target aarch64-linux-android21
)। বিরল ক্ষেত্রে যেখানে আপনি যে বিল্ড সিস্টেমটি ব্যবহার করছেন সেটি ব্যবহার করতে সক্ষম নয়। ফর্ম, ট্রিপল-প্রিফিক্সড ক্ল্যাং বাইনারি ব্যবহার করুন।
অটোকনফ
অটোকনফ প্রজেক্ট আপনাকে এনভায়রনমেন্ট ভেরিয়েবলের সাথে ব্যবহার করার জন্য টুলচেইন নির্দিষ্ট করতে দেয়। উদাহরণ স্বরূপ, লিনাক্সে এপিআই লেভেল 21-এর একটি minSdkVersion
সহ Android x86-64-এর জন্য libpng
কীভাবে তৈরি করা যায় তা নিম্নলিখিতটি দেখায়।
# 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 এবং নতুনের জন্য সঠিক। পুরানো NDK-এর জন্য বিভিন্ন টুলের প্রয়োজন হতে পারে।
অ-অটোকনফ প্রকল্প তৈরি করে
কিছু মেকফাইল প্রজেক্ট একই ভেরিয়েবলকে ওভাররাইড করে ক্রস কম্পাইলেশনের অনুমতি দেয় যা আপনি একটি অটোকনফ প্রজেক্টের সাথে করবেন। একটি উদাহরণ হিসাবে, নিম্নলিখিতটি 21 এর একটি minSdkVersion
সহ Android x86-64 এর জন্য 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 এবং নতুনের জন্য সঠিক। পুরানো NDK-এর জন্য বিভিন্ন টুলের প্রয়োজন হতে পারে।