שימוש ב-NDK עם מערכות פיתוח אחרות

ה-NDK כולל תמיכה רשמית עבור ndk-build ו-CMake. רוב המשתמשים צריכים עיינו באחד מהמדריכים האלה לפיתוח קוד אפליקציה. המטרה של במסמך הזה מתואר איך לבנות קוד קיים שמשתמש בגרסת build אחרת המערכות שלנו. לרוב המצב הזה קורה כשיש יחסי תלות של צד שלישי ספציפי ל-Android, כגון OpenSSL ו-libzip2.

פיתוח מתחזקי מערכות שמעוניינים להוסיף תמיכה NDK מותאמת ל-build שלהם במקום זאת, המערכות צריכות לקרוא את המדריך למתחזקי מערכות Build.

סקירה כללית

ניתן להשתמש במהדר (compiler) Clang ב-NDK עם הגדרות אישיות מינימליות בלבד שנדרש כדי להגדיר את סביבת היעד.

כדי לוודא שאתם יוצרים את הארכיטקטורה הנכונה, מעבירים את להשתמש ב--target כשמפעילים את Clang. לדוגמה, כדי להדר לפורמט של 64 סיביות ARM Android עם minSdkVersion מתוך 21, עליך לבצע את הפעולות הבאות:

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

לחלופין, יש נקודות כניסה עם קידומת ליעד של Clang. האפשרויות האלה יכולות להיות קישורים סימבוליים או סקריפטים שמעבירים ל-clang, בהתאם לגרסת NDK. ומערכת ההפעלה המארחת. הפעלת Clang ישירות מול --target תהיה אמינה יותר, מכיוון זה תהליך העבודה שנבדק ביותר, ומדי פעם יש העברת ארגומנטים באגים בסקריפטים. ב-Windows, תוספת של CreateProcess שנדרשת כדי להעביר מהתסריט ועד למהדר (compiler) אמיתי, יכול להיות יש לכך השפעה שלילית על מהירות ה-build.

$ $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++; לכלים דו-כיווניים (כמו 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

של פרויקטים רבים סקריפטים של build יצפו למהדרים מוצלבים בסגנון GCC, כאשר כל מהדר מטרגט רק שילוב אחד של מערכת הפעלה וארכיטקטורה, לכן יכול להיות שהוא לא יטפל -target נקייה. במקרים כאלה, אפשר בדרך כלל לכלול את -target כחלק מהגדרת המהדר (למשל CC="clang -target aarch64-linux-android21). במקרים נדירים שבהם מערכת ה-build שבה משתמשים ולא יוכלו להשתמש בטופס הזה, השתמשו בקבצים הבינאריים של Clang עם קידומת משולשת.

ניהול אוטומטי

פרויקטים של Autoconf מאפשרים לציין את 'צרור הכלים' לשימוש עם הסביבה משתנים. למשל, בסרטון הבא מוסבר איך לפתח את libpng ל-Android x86-64 עם minSdkVersion של רמת API: 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/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 מאפשרים הידור (compilation) אחר על ידי שינוי של אותם משתנים שהייתם עושים בפרויקט של שיחת ועידה אוטומטית. הדוגמה הבאה מראה איך כדי לבנות את 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/clang --target=$TARGET$API" \
    AR=$TOOLCHAIN/bin/llvm-ar \
    RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
    bzip2

הכלים שנבחרו בדוגמה הזו מתאימים ל-NDK r22 ואילך. קבוצות NDK ישנות יותר עשויים לדרוש כלים אחרים.