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

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

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

نظرة عامة

يمكن استخدام مترجم Clang في NDK بأقل قدر من الإعداد المطلوبة لتحديد البيئة المستهدفة.

للتأكد من قيامك بالإنشاء للبنية الصحيحة، اجتز الاختبار الاستهداف باستخدام -target عند استدعاء Clang. على سبيل المثال، التجميع لنظام 64 بت عليك إجراء ما يلي من معالِج Android ARM مع minSdkVersion من 21:

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
    --target aarch64-linux-android21 foo.cpp

بدلاً من ذلك، هناك نقاط دخول تبدأ ببادئة الهدف للغة Clang. قد تكون هذه روابط رمزية أو نصوص برمجية تعيد التوجيه إلى رنين، اعتمادًا على إصدار NDK ومضيف نظام التشغيل. سيكون استدعاء لغة Clang مباشرةً مع --target أكثر موثوقية، الذي يمثل سير العمل الأكثر اختبارًا، وتتوفر في بعض الأحيان إعادة توجيه الوسيطات الأخطاء في البرامج النصية. على نظام التشغيل Windows، يجب توفير مبلغ CreateProcess إضافي لإعادة التوجيه. من البرنامج النصي إلى المبرمج الحقيقي تأثير سلبي على سرعة الإصدار.

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
    foo.cpp

في كلتا الحالتين، استبدِل $NDK بالمسار إلى NDK و$HOST_TAG لمطابقة. NDK الذي قمت بتنزيله وفقًا للجدول التالي:

صيغة نظام التشغيل NDK علامة المضيف
نظام التشغيل Mac 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
×86 i686-linux-android
X86- 64 x86_64-linux-android

للعديد من المشروعات من المتوقع أن تتوقع نصوص إنشاء النصوص البرمجية التجميعية المشتركة بنمط GCC حيث يستهدف برنامج التحويل البرمجي مجموعة واحدة فقط من أنظمة التشغيل/البنية، ولذلك قد لا يتعامل مع -target نظيف. وفي هذه الحالات، يمكنك عادةً تضمين -target. الوسيطة كجزء من تعريف برنامج التحويل البرمجي (مثل CC="clang -target aarch64-linux-android21). في حالات نادرة، عندما يكون نظام التصميم الذي تستخدمه لا يستطيع استخدام هذا النموذج، استخدم برامج Clang الثنائية ذات البادئات الثلاثية.

اجتماع تلقائي

تتيح لك مشاريع مؤتمر Autoconf تحديد سلسلة الأدوات المطلوب استخدامها مع البيئة. المتغيرات. على سبيل المثال، يوضح ما يلي كيفية إنشاء libpng لنظام Android. x86-64 مع المستوى 21 من واجهة برمجة التطبيقات minSdkVersion، على نظام التشغيل 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

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

مشاريع إنشاء غير مُضمنة تلقائيًا

تسمح بعض مشروعات makefile بالتجميع المتقاطع عن طريق تجاوز نفس المتغيرات التي ستفعلها مع مشروع مؤتمر تلقائي. على سبيل المثال، يوضح ما يلي كيف لإصدار libbzip2 للتوافق مع الإصدار x86-64 من نظام التشغيل Android مع 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 أقدم أدوات مختلفة.