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