NDK شامل پشتیبانی رسمی برای ndk-build و CMake است . اکثر کاربران باید به یکی از آن راهنماها برای ساخت کد برنامه مراجعه کنند. هدف این سند شرح چگونگی ساخت کدهای موجود است که از سیستم های ساخت دیگر استفاده می کند. این اغلب در مورد وابستگی های شخص ثالث که مختص اندروید نیستند، مانند OpenSSL و libbzip2 صدق می کند.
نگهدارندگان سیستم بیلد که به دنبال اضافه کردن پشتیبانی NDK بومی به سیستمهای ساخت خود هستند، باید راهنمای حفظکننده سیستم ساخت را مطالعه کنند.
نمای کلی
کامپایلر Clang در NDK تنها با حداقل پیکربندی مورد نیاز برای تعریف محیط هدف شما قابل استفاده است.
برای اطمینان از ساختن برای معماری صحیح، هنگام فراخوانی Clang، هدف مناسب را با -target
عبور دهید. به عنوان مثال، برای کامپایل برای اندروید ARM 64 بیتی با minSdkVersion
21، موارد زیر را انجام دهید:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
--target=aarch64-linux-android21 foo.cpp
از طرف دیگر، نقاط ورودی با پیشوند هدف برای Clang وجود دارد. بسته به نسخه NDK و سیستم عامل میزبان، اینها ممکن است پیوندهای نمادین یا اسکریپت هایی باشند که به صدای زنگ ارسال می شوند. فراخوانی Clang به طور مستقیم با --target
قابل اعتمادتر خواهد بود، زیرا این جریان کار آزمایش شده ترین است و گاهی اوقات اشکالات ارسال استدلال در اسکریپت ها وجود دارد. در ویندوز، CreateProcess
اضافی مورد نیاز برای ارسال از اسکریپت به کامپایلر واقعی می تواند تأثیر منفی قابل توجهی بر سرعت ساخت داشته باشد.
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
foo.cpp
در هر دو مورد، $NDK
با مسیر NDK و $HOST_TAG
جایگزین کنید تا مطابق جدول زیر با NDK دانلود شده مطابقت داشته باشد:
نوع سیستم عامل NDK | تگ میزبان |
---|---|
macOS | darwin-x86_64 |
لینوکس | linux-x86_64 |
ویندوز 64 بیتی | windows-x86_64 |
قالب پیشوند یا آرگومان هدف در اینجا سه گانه هدف با پسوندی است که نشان دهنده minSdkVersion
است. این پسوند فقط با clang/clang++ استفاده می شود. ابزارهای binutils (مانند ar
و strip
) به پسوند نیاز ندارند زیرا تحت تأثیر minSdkVersion
قرار ندارند. اهداف سه گانه پشتیبانی شده اندروید به شرح زیر است:
ABI | سه گانه |
---|---|
armeabi-v7a | armv7a-linux-androideabi |
arm64-v8a | aarch64-linux-android |
x86 | i686-linux-android |
x86-64 | x86_64-linux-android |
اسکریپتهای ساخت بسیاری از پروژهها از کامپایلرهای متقاطع به سبک GCC انتظار دارند که در آن هر کامپایلر تنها یک ترکیب سیستمعامل/معماری را هدف قرار میدهد و بنابراین ممکن است -target
بهخوبی مدیریت نکند. در این موارد، شما معمولاً می توانید آرگومان -target
را به عنوان بخشی از تعریف کامپایلر وارد کنید (به عنوان مثال CC="clang -target aarch64-linux-android21
). در موارد نادری که سیستم ساختی که استفاده می کنید قادر به استفاده از آن نیست. فرم، از باینری های Clang با پیشوند سه گانه استفاده کنید.
تنظیم خودکار
پروژه های Autoconf به شما امکان می دهند زنجیره ابزاری را برای استفاده با متغیرهای محیطی مشخص کنید. به عنوان مثال، در ادامه نحوه ساخت libpng
برای اندروید x86-64 با minSdkVersion
سطح 21 API در لینوکس نشان داده شده است.
# 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های قدیمی ممکن است به ابزارهای مختلفی نیاز داشته باشند.
پروژه های ساخت غیر خودکار
برخی از پروژههای makefile امکان کامپایل متقابل را با نادیده گرفتن همان متغیرهایی که با یک پروژه خودکار تنظیم میکنید را فراهم میکنند. به عنوان مثال، در ادامه نحوه ساخت libbzip2
برای اندروید x86-64 با minSdkVersion
21 نشان داده شده است.
# 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های قدیمی ممکن است به ابزارهای مختلفی نیاز داشته باشند.