استخدام نظام NDK مع أنظمة الإنشاء الأخرى

يتضمّن 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 الأقدم أدوات مختلفة.