از NDK با سایر سیستم های ساخت استفاده کنید

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های قدیمی ممکن است به ابزارهای مختلفی نیاز داشته باشند.