يتضمّن NDK دعمًا رسميًا لكل من ndk-build وCMake. يجب على معظم المستخدمين الرجوع إلى أحد هذه الأدلة لإنشاء كود التطبيق. والغرض من هذه الوثيقة هو وصف كيفية إنشاء التعليمات البرمجية الحالية التي تستخدم أنظمة إنشاء أخرى. وغالبًا ما يحدث هذا مع تبعيات الجهات الخارجية التي لا ترتبط بنظام التشغيل Android، مثل OpenSSL وlibbzip2.
وعلى مشرفي نظام الإصدار الذين يتطلعون إلى إضافة دعم NDK أصلي إلى أنظمة الإنشاء الاطّلاع على دليل صيانة النظام بدلاً من ذلك.
نظرة عامة
المحول البرمجي Clang في NDK قابل للاستخدام مع الحد الأدنى من التكوين المطلوب فقط لتحديد البيئة الهدف.
لضمان إنشاء بنية مناسبة للبنية الصحيحة، عليك إما ضبط الهدف المناسب من خلال -target
عند استدعاء Clang، أو استدعاء Clang ذات البادئة المستهدفة. على سبيل المثال، عند تجميع حزمة ARM Android بنظام 64 بت مع
minSdkVersion
من 21، سيعمل أي مما يلي، ويمكنك استخدام أيهما تراه أكثر ملاءمة:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
-target aarch64-linux-android21 foo.cpp
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
foo.cpp
في كلتا الحالتين، استبدِل $NDK
بالمسار إلى NDK و$HOST_TAG
لمطابقة NDK الذي نزّلته وفقًا للجدول التالي:
الإصدار المختلف لنظام التشغيل NDK | علامة المضيف |
---|---|
macOS | darwin-x86_64 |
نظام التشغيل Linux | linux-x86_64 |
Windows 64 بت | windows-x86_64 |
إنّ تنسيق البادئة أو الوسيطة الهدف هنا هو الثلاثي الهدف مع لاحقة تشير إلى minSdkVersion
. لا تُستخدَم هذه اللاحقة إلا مع clang/clang++ ، ولا تتطلّب أدوات binutils (مثل ar
وstrip
) إضافة لاحقة لأنها لا تتأثر بـ minSdkVersion
. في ما يلي المستويات الثلاثية المستهدفة
المتوافقة من Android:
قيمة 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
لنظام التشغيل Android x86-64 مع minSdkVersion
من المستوى 21 من واجهة برمجة التطبيقات على نظام التشغيل 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/$TARGET$API-clang export AS=$CC export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++ export LD=$TOOLCHAIN/bin/ld export RANLIB=$TOOLCHAIN/bin/llvm-ranlib export STRIP=$TOOLCHAIN/bin/llvm-strip ./configure --host $TARGET make
الأدوات المحددة في هذا النموذج صحيحة مع NDK r22 والإصدارات الأحدث. قد تتطلب NDKs الأقدم أدوات مختلفة.
إنشاء المشاريع بدون استخدام الربط التلقائي
تتيح بعض مشاريع makefile إمكانية التجميع المتبادل من خلال تجاوز المتغيرات نفسها التي تستخدمها في مشروع ذات تنسيق تلقائي. على سبيل المثال، يوضِّح ما يلي كيفية إنشاء libbzip2
لنظام التشغيل Android 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/$TARGET$API-clang \
AR=$TOOLCHAIN/bin/llvm-ar \
RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
bzip2
الأدوات المحددة في هذا النموذج صحيحة مع NDK r22 والإصدارات الأحدث. قد تتطلب NDKs الأقدم أدوات مختلفة.