הגדרות קישור נדרשות

בשלב ה-build של הקישור (שלב ה-build של 'Link Binary With Libraries' של Xcode) צריך להפעיל דגלים ספציפיים ל-J2ObjC, שמשתנים בהתאם לאופן שבו האפליקציה משתמשת במחלקות Java מתורגמות. דגלי הליבה מוגדרים באמצעות הסקריפט j2objcc של שורת הפקודה, אבל יש לציין אותם בפיתוח באמצעות Xcode.

ספריות SDK

הספרייה הזו נדרשת על ידי הטמעת JRE של J2ObjC. אם הספרייה הזו לא נכללה, יופיעו שגיאות לא מוגדרות בסמלים עם שמות שמתחילים ב-_iconv.

ספרייהסימון קישורהתיאור
Iconv -l iconv משמש את jre_core לקידוד תווים ולפענוח הקוד.

הספריות האלה נמצאות בשימוש בהטמעת JRE של J2ObjC, ויכול להיות שיהיה צורך לקשר אותן לאפליקציה שלכם.

ספרייהסימון קישורהתיאור
zip -l z משמש את java.util.zip. צריך לכלול את המזהה הזה אם מקשרים לכתובת jre_zip.
אבטחה -framework Security חובה אם מקשרים את jre_security.

נתיב חיפוש בספרייה

ההפצה של J2ObjC כוללת מספר ספריות סטטיות. כדי להשתמש בהן, הפרויקט צריך להנחות את הגורם המקשר איפה הן נמצאות.

באופן כללי, נתיב החיפוש בספרייה צריך לכלול _$(j2objcdistribution)/lib, כאשר המשתנה _$(j2objcdistribution) הוא הנתיב לעותק המקומי של J2ObjC. לדוגמה, אם פורסת קובץ ארכיון של נתוני J2ObjC אל '/usr/local/', הנתיב הזה יהיה '/usr/local/j2objc'.

חשוב: אין להשתמש בפועל ב- _$(j2objcdistribution) בפרויקט שלכם, עליכם לציין תמיד את הנתיב בפועל שבו התקנתם את J2ObjC.

אם יוצרים את ה-J2ObjC מעותק של קוד המקור שלו, _$(j2objcdistribution) היא הספרייה 'j2objc/dist/' של העותק. הספרייה הזו לא תהיה קיימת עד ליצירת J2ObjC עם make dist.

Xcode: נתיבי חיפוש בספרייה

עדכן את נתיבי חיפוש הספרייה של היעד של האפליקציה, על ידי הוספת _$(j2objcdistribution)/lib (שוב, השתמש בנתיב האמיתי).

ספריות JRE

בספריות האלה מוטמעות מחלקות שהוגדרו על ידי אמולציית JRE של J2ObjC.

הערה: הספרייה libjre_core.a מכילה מחלקות מרוב ספריות המשנה האחרות. הדרך המומלצת להקטין את גודל האפליקציה היא להתחיל לקשר את האפליקציה עם -l jre_core, ואז להוסיף את ספריות המשנה שמטפלות בסמלים החסרים. לדוגמה, המחלקות הכי נפוצות של java.io נמצאות ב-libjre_core.a, לכן צריך לכלול את הספרייה libjre_io.a רק אם יש שגיאות סמלים שלא נפתרו שהשמות שלהן מתחילים ב-JavaIo.

ספרייהסימון קישורהתיאור
libjre_core.a -l jre_core קבוצת המחלקות המינימלית שנדרשת לאמולציית JRE של J2ObjC, ומצוינת בכל קובצי המקור שנוצרו. אם מקורות ה-Java המתורגמים שלך מפנים לתמיכה ב-JRE עבור דברים כמו Networking , XML , SQL וכו', יהיה צורך לקשר גם ספריות נוספות (בהמשך).
libjre_beans.a -l jre_beans כל המחלקות מהחבילה java.beans. לא כל המחלקות של תרמילי Java נכללים, מאחר שברבות מהן נעשה שימוש רק באפליקציות של Swing ו-AWT.
libjre_channels.a -l jre_channels מספר מחלקות מהחבילות java.nio.channels ו-java.nio.channels.spi.
libjre_concurrent.a -l jre_concurrent מספר מחלקות מהחבילות של java.util.concurrent, java.util.concurrent.atomic ו-java.util.concurrent.locks.
libjre_icu.a -l jre_icu מספר כיתות החל מ-android.icu לתמיכה באזורי זמן (בעיקר כדי להפעיל את java.time).
libjre_io.a -l jre_io מספר מחלקות (בשימוש פחות תדיר) מהחבילה java.io.
libjre_net.a -l jre_net מספר מחלקות בחבילה java.net. עם זאת, הכיתה java.net.URLClassLoader היא jre_security, ואילו הכיתות javax.net וכן javax.net.ssl שייכים לjre_ssl.
libjre_security.a -l jre_security רוב הכיתות בחבילה של java.security (חלקן נמצאות ב-jre_core), וכן הכיתות בחבילות java.security.*, javax.crypto.* ו-javax.security.*. אם מקשרים את זה, צריך גם לקשר את iOS Security framework. (פרטים נוספים זמינים במאמר ספריות SDK)
libjre_sql.a -l jre_sql כל המחלקות בחבילה java.sql.
libjre_ssl.a -l jre_ssl כל הכיתות בחבילות javax.net ו-javax.net.ssl.
libjre_time.a -l jre_time כל המחלקות בחבילה java.time.
libjre_util.a -l jre_util מספר מחלקות מהחבילה java.util, וגם מהחבילה java.util.logging. עם זאת, רוב המחלקות java.util נמצאות ב-jre_core, לכן צריך לכלול את הספרייה הזו רק אם יש שגיאות לא פתורות של סמלי JavaUtil* (JavaUtilConcurrent* סמלים נמצאים בספרייה jre_concurrent).
libjre_xml.a -l jre_xml כל המחלקות מהחבילות הקשורות ל-XML, כולל javax.xml.*, org.w3c.dom.* ו-org.xml.sax.*.
libjre_zip.a -l jre_zip כל המחלקות מהחבילות java.util.zip ו-java.util.jar. אם תקשרו את זה, תצטרכו לקשר גם את ספריית ה-zip של ה-SDK. (פרטים נוספים זמינים במאמר ספריות SDK)

libjre_emul.a (-l jre_emul)

הספרייה jre_emul מכילה את כל המחלקות שכלולות באמולציית JRE של J2ObjC. אם אפליקציה מקושרת אל jre_emul, אין לכלול את ספריות jre_* האחרות, או שה-linker ידווח על שגיאות סמלים כפולים. הסיבה לכך היא שהשדה jre_emul כולל את כל המחלקות שהוגדרו בספריות האחרות.

ספריות נוספות של J2ObjC

ספריות Java ומחלקות util של Android כלולות בהפצת J2ObjC כספריות סטטיות:

ספרייהסימון קישורהתיאור
libguava.a -l גויאבה גואבה: ספריות Google Core for Java
libjavax_inject.a -l javax_injecting ספריית ההערות של הזרקת תלות של JSR-330.
libjson.a -l json ספריית חילופי הנתונים JSON. זוהי גרסת Android של JSON, ששונה מעט מהטמעות אחרות.
libjsr305.a -l jsr305 הערות JSR-305 עבור הספרייה לאיתור פגמים בתוכנה.
libjunit.a -l junit -ObjC מסגרת הבדיקה של JUnit.
libmockito.a -l mockito - -ObjC מסגרת ההדמיה של Mockito לבדיקות יחידה ב-Java.
libprotobuf_runtime.a -l protobuf_runtime זמן ריצה עם Google Protocol Buffer, שעבר אופטימיזציה לאפליקציות J2ObjC. באפליקציות שמשתמשות ב-J2ObjC protobufs צריכות להדר את קובצי האב שלהן באמצעות j2objc_protoc.
libandroid_util.a -l android_util הספרייה 'android_util' מכילה קבוצת משנה קטנה של מחלקות כלי השירות של Android API. היא לא מיועדת לספק אמולציה בסביבת Android, אלא רק דרך לשתף מחלקות מועילות כמו 'android.util.Log'.

הדגל -ObjC נמצא בשימוש לעיתים קרובות כשמקשרים אפליקציות ל-iOS, אבל הוא נדרש רק כשיש צורך לטעון באופן דינמי מחלקות וקטגוריות של ObjectiveC מספריות סטטיות. הסימון הזה גורם לכך שכל המחלקות בכל הספריות הסטטיות המקושרות ייכללו באפליקציה, גם אם הן לא נמצאות בשימוש בפועל. לכן, מומלץ שאפליקציות שמשתמשות ב-J2ObjC יקשרו עם הדגל -ObjC רק במקרים שבהם המחלקות לא נטענות בזמן הריצה (תסמין אחד הוא התרעה של JavaLangClassNotFoundException).

מסגרות הבדיקה של JUnit ו-Mockito מסתמכות במידה רבה על השתקפות, לכן אפליקציות לבדיקה שמשתמשות בהן צריכות לקשר את האפליקציות האלה ל--ObjC.

כחלופה לקישור בספרייה סטטית שלמה, כך שניתן יהיה לטעון מספר מחלקות באופן דינמי, ניתן להפנות באופן סטטי למחלקות האלה. ב-Java אפשר לעשות את זה בבלוק של מאתחל סטטי; דוגמה ממחלקה IosSecurityProvider של J2ObjC:

  // Reference all dynamically loaded classes, so they are linked into apps.
  @SuppressWarnings("unused")
  private static final Class<?>[] unused = {
    IosCertificateFactory.class,
    IosMD5MessageDigest.class,
    IosRSAKeyFactory.class,
    IosRSAKeyPairGenerator.class,
    IosRSASignature.class,
    IosSecureRandomImpl.class,
    IosSHAMessageDigest.class
  };