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

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