טיפים לעבודה ב־C++‎ באנדרויד

בשבועות האחרונים עבודה אני עובד על יישום C++‎ שבגדול אמור לרוץ על אנדרויד. החלטתי בתור התחלה לכתוב את זה על PC רגיל כדי להשתמש בכלים פשוטים ורגילים (QtCreator, cmake, valgrind ועוד…). ברגע ההסבה לאנדרויד נתקלתי בכמה דברים:

  1. לגרום ל־cmake לקמפל עבור אנדרויד לא מסובך מדי, רק לקבוע כמה משתני סביבה לפני ההרצה של cmake וזהו. פרטים כאן: http://opekar.blogspot.com/2011/06/android-cmake-is-much-easier-in-ndk-r5b.html
  2. להשתמש בקבצי הכללה של C++ ואז לעשות using namespace זה מגניב, אבל לא עובד. ב־NDK האחרון הם לא נמצאים. פשוט תשתמשו בקבצי ההכללות הישנים והטובים של C.
  3. בעת הקישור (linking) אין צורך לקשר את pthreads, הפונקציות של threads נמצאות ישירות ב־Bionic. אין צורך לעשות -lpthread.
  4. אם אתם משתמשים בטריקים מלוכלכים כמו לקרוא ישירות ל־syscall יהיו לכם בעיות. השמות של הקריאות שונה. אני לא מסביר מעבר לכך כאן, מי שמספיק חכם לעשות דברים כאלו יידע למצוא את השמות המאימים ולעשות את ההתאמה בעזרת ifdef במקום מרכזי אחד (אני הגדרתי מחדש לפי השמות של glibc).

בשביל מספר 3 (חחח) אני השתמשתי בקטע קוד הזה בקובץ cmake שלי:

if( $ENV{BUILD_ANDROID})

    message(“Building for android, not linking pthread”)
else()
message(“Building for glibc, linking pthread”)
target_link_libraries(my_super_cool_application pthread)
endif()

וזה אומר שלפני ההפעלה של cmake רק צריך להגדיר עוד משתנה סביבה BUILD_ANDROID=1. פשוט שמתי אותו ב־script שקישרתי בתחילת הפוסט ואני עושה לו source לפני הבנייה.

מצד שני, היישום שלי עבד על הפעם הראשונה שם (וזה עוד client server…). זה אומר שהסבה של יישום מ־amd64 אל arm32 עבדה חלק מצד האפליקציה והיו לי רק בעיות build system פשוטות (שלקחו לי כמעט שעתיים…). כן, גוגל עשו פאקים ב־NDK, אבל בגדול, מגניב 🙂

עוד משהו שלמדתי מחדש, כמה חשוב זה לעשות out of source builds. ככה אני יכול באותו זמן לבנות את היישום לשתי פלטפורמות שונות בקלות.

Share Button

One thought on “טיפים לעבודה ב־C++‎ באנדרויד”

להגיב על elcuco לבטל

האימייל לא יוצג באתר. שדות החובה מסומנים *