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

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

ספריות SDK

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

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

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

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

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

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

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

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

אם יוצרים J2ObjC מעותק של קוד המקור שלו, _$(j2objcהפצה) הוא "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 מספר הכיתות המינימלי נדרש לאמולציית J2 של J2ObjC, שאליה התייחסו כל קובצי המקור שנוצרו על ידי AI. אם מקורות Java המתורגמים מתייחסים לתמיכה ב-JRE דברים כמו רשתות, 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. (מידע נוסף זמין בקטע ספריות 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_* האחרות, אחרת המקשר לדווח על שגיאות בסמלים כפולים. הסיבה לכך היא ש-jre_emul כולל את כל המחלקות שהוגדרו לספריות אחרות.

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

ספריות Java ומחלקות השימוש ב-Android האלה כלולות ב-J2ObjC את ההתפלגות כספריות סטטיות:

ספרייהסימון קישורתיאור
libguava.a -l גויאבה גויאבה: ספריות הליבה של Google ל-Java
libjavax_inject.a -l Javax_inject החדרת תלות 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 ה-framework של Mockito לבדיקת יחידה ב-Java.
libprotobuf_runtime.a -l protobuf_runtime מאגר אחסון לפרוטוקולים של Google זמן ריצה, מותאם לאפליקציות של J2ObjC. אפליקציות שמשתמשות בפרוטופים של J2ObjC צריכות להדר את ה-Proto שלהן קבצים עם j2objc_protoc.
libandroid_util.a -l android_util הספרייה 'android_util' מכילה קבוצת משנה קטנה של סוגי השימושים של Android API. האפליקציה לא נועדה לספק אמולציה לסביבת Android, אלא רק דרך לשתף סיווגים שימושיים כמו 'android.util.Log'.

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

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

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

  // 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
  };