NDK شامل پشتیبانی رسمی برای ndk-build و CMake است . اکثر کاربران باید به یکی از آن راهنماها برای ساخت کد برنامه مراجعه کنند. هدف این سند شرح چگونگی ساخت کدهای موجود است که از سیستم های ساخت دیگر استفاده می کند. این اغلب در مورد وابستگی های شخص ثالث که مختص اندروید نیستند، مانند OpenSSL و libbzip2 صدق می کند.
نگهدارندگان سیستم بیلد که به دنبال اضافه کردن پشتیبانی NDK بومی به سیستمهای ساخت خود هستند، باید راهنمای حفظکننده سیستم ساخت را مطالعه کنند.
نمای کلی
کامپایلر Clang در NDK تنها با حداقل پیکربندی مورد نیاز برای تعریف محیط هدف شما قابل استفاده است.
برای اطمینان از ساختن برای معماری صحیح، هنگام فراخوانی Clang، هدف مناسب را با -target
عبور دهید. For example, to compile for 64-bit ARM Android with a minSdkVersion
of 21, do the following:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
--target=aarch64-linux-android21 foo.cpp
از طرف دیگر ، نقاط ورودی با پیشوند هدف برای Clang وجود دارد. این بسته به نسخه NDK و سیستم عامل میزبان ، ممکن است این یا Symlinks یا اسکریپت هایی باشد که به Clang می روند. فراخوانی 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 به شما امکان می دهد تا ابزار ابزار را برای استفاده با متغیرهای محیط مشخص کنید. For example, the following shows how to build libpng
for Android x86-64 with a minSdkVersion
of API level 21, on Linux.
# 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
The tools selected in this sample are correct for NDK r22 and newer. NDKهای قدیمی ممکن است به ابزارهای مختلفی نیاز داشته باشند.
پروژه های ساخت غیر خودکار
Some makefile projects allow cross compilation by overriding the same variables that you would with an autoconf project. As an example, the following shows how to build libbzip2
for Android x86-64 with a minSdkVersion
of 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
The tools selected in this sample are correct for NDK r22 and newer. NDKهای قدیمی ممکن است به ابزارهای مختلفی نیاز داشته باشند.