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

تحتوي اتفاقية عدم الإفشاء على الدعم الرسمي لـ ndk-build وCMake. وعلى معظم المستخدمين الرجوع إلى أحد هذه الأدلة لإنشاء رمز التطبيق. يهدف هذا المستند إلى توضيح كيفية إنشاء رمز حالي يستخدم أنظمة إصدار أخرى. وغالبًا ما يكون ذلك هو الحال مع الموارد التابعة التابعة لجهات خارجية والتي لا تتعلّق بنظام التشغيل Android، مثل OpenSSL وlibbzip2.

عليك بدلاً من ذلك الاطّلاع على دليل إنشاء نظام إدارة النظام الخاص بـ "مطوّري أنظمة الإنشاء" الذين يريدون إضافة التوافق مع نظام NDK الأصلي إلى أنظمة الإنشاء الخاصة بهم.

نظرة عامة

يمكن استخدام برنامج التجميع CND في 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++ ، ولا تتطلّب أدوات binutil (مثل 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) أو استخدام الترميزات الثنائية التي تحمل بادئة ثلاثية.

الثقة التلقائية

تسمح لك مشاريع 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

الأدوات التي تم اختيارها في هذا النموذج صحيحة للإصدار r22 من الإصدار الفيتنامي الجديد (NDK) والإصدارات الأحدث. وقد يتطلّب رمز المنتج الجديد (NDK) أدوات مختلفة.

مشاريع تصميم آلية غير للمؤتمرات التلقائية

توفّر بعض مشاريع Makefile تجميعًا متبادلاً من خلال إلغاء المتغيّرات نفسها التي تستخدمها في مشروع Autoconf. وكمثال على ذلك، يوضّح ما يلي كيفية إنشاء 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

الأدوات التي تم اختيارها في هذا النموذج صحيحة للإصدار r22 من الإصدار الفيتنامي الجديد (NDK) والإصدارات الأحدث. وقد يتطلّب رمز المنتج الجديد (NDK) أدوات مختلفة.