איך משאבי Java ממופים למשאבי iOS

מהם משאבי Java

משאבי Java הם קובצי נתונים הארוזים בחבילות יחד עם ספריות ויישומי Java. המשאבים האלה נטענים בזמן הריצה – Class.getResource(String name), שמחזירה ערך של java.net.URL, או Class.getResourceAsStream(String name) ומחזירה ערך java.io.InputStream. בדרך כלל משתמשים ב-method getResourceAsStream() כשמשאב צפוי להיות זמין, כי הוא מחזיר IOException אם הוא לא זמין. השיטה getResource() מחזירה null אם המשאב לא קיים, לכן כדאי לבדוק משאבים אופציונליים.

שמות ונתיבים של משאבים

J2ObjC מאתרת משאבים באמצעות בדיקה בחבילה הראשית של האפליקציה ([NSBundle mainBundle]) באמצעות הנתיב היחסי או המוחלט של המשאב:

נתיבים יחסיים

השיטה המועדפת לציון נתיבי משאבים היא שימוש בנתיבים יחסיים. נתיבים יחסיים לא מתחילים בקו נטוי ('/'). כשקוראים משאב עם נתיב יחסי, שם החבילה של המחלקה משתנה ומשנים את הנקודות ('.') בשם החבילה לקווים נטויים קדימה ('/'). הנתיב היחסי שמצוין בקריאה לשיטה Class.getResource(String name) או Class.getResourceAsStream(String name) מצורף לנתיב החבילה.

לדוגמה, אם לאפליקציה יש מחלקה foo.bar.Mumble, הנתיב הבסיסי לכל המשאבים ביחס למחלקות בחבילה הזו הוא /foo/bar. כשמפעילים את Mumble.class.getResource("oops/error.jpg"), הפרמטר oops/error.jpg מתווסף לנתיב של החבילה, ולכן הנתיב המלא של המשאב הוא /foo/bar/oops/error.jpg.

נתיבים מוחלטים

אפשר לגשת למשאב גם באמצעות נתיב מוחלט, על ידי התחלת שם המשאב בקו נטוי קדימה ('/'). המערכת מתעלמת משמות החבילות, ולכן J2ObjC מאתרת נתיבים מוחלטים בחבילה הראשית של האפליקציה באמצעות הנתיבים בדיוק כפי שצוינו בהפניות Class.getResource(String name) או Class.getResourceAsStream(String name) במקורות ה-Java של האפליקציה. בדוגמה שלמעלה, ל-Mumble.class.getResource("/oops/error.jpg") יש נתיב משאב מלא של /oops/error.jpg, והוא מתעלם משם החבילה foo.bar.

הוספת משאבים לאפליקציה ל-iOS

כדי להוסיף קובצי משאבים לאפליקציית iOS ב-Xcode, צריך לפתוח את הכרטיסייה 'שלבי Build' של יעד ה-build. לאחר מכן:

  • לוחצים על הסמל + (בכרטיסייה 'כללי') ובוחרים באפשרות 'שלב חדש של העתקת קבצים'.
  • בוחרים באפשרות 'משאבים' בתור היעד (לא משאבי Java).
  • יש לציין את הספרייה של המשאבים.
  • בוחרים באפשרות + ומוסיפים את הקבצים לרשימה.

בין אם משתמשים בנתיבי משאבים יחסיים או מוחלטים, לכל ספריית משאבים נדרש שלב build נפרד של Copy Files ב-build של Xcode.

דוגמה

בפרויקט JreEmulation יש אפליקציה בשם 'JRE JUnit Tests' שמריצה בדיקות יחידה של הספרייה הזו. ניתן לבחור את שלבי ה-Build של היעד הזה כדי לראות כמה שלבים של 'העתקת קבצים', אחד לכל נתיב יחסי שמשמשים את המשאבים שלו. במקרה הזה, הקוד ClassTest.java טוען את אותו משאב תחילה באמצעות נתיב מוחלט ולאחר מכן באמצעות נתיב יחסי. משאב הבדיקה נכלל בשלב הזה של העתקת קובצי ה-build:

משאבי Xcode