בשלב ה-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
הדגל -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
};