ה-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 ישנות יותר עשויים לדרוש כלים אחרים.