लिंक की ज़रूरी सेटिंग

लिंक बनाने के चरण (Xcode का "लिंक बाइनरी विद लाइब्रेरी" बिल्ड फ़ेज़) में J2ObjC के खास फ़्लैग की ज़रूरत होती है. ये फ़्लैग इस बात पर निर्भर करते हैं कि आपका ऐप्लिकेशन अनुवाद की गई Java क्लास का इस्तेमाल कैसे करता है. मुख्य फ़्लैग j2objcc कमांड-लाइन स्क्रिप्ट से सेट किए जाते हैं, लेकिन Xcode के साथ बनाते समय इन्हें बताना ज़रूरी है.

SDK लाइब्रेरी

J2ObjC के JRE लागू करने के लिए यह लाइब्रेरी ज़रूरी है. इस लाइब्रेरी को शामिल न करने पर, _iconv से शुरू होने वाले नामों के साथ सिंबल से जुड़ी गड़बड़ियां दिखेंगी.

लाइब्रेरीलिंक फ़्लैगब्यौरा
आइकॉनv -l आइकॉनv jre_core कैरेक्टर एन्कोडिंग और डिकोडिंग के लिए इस्तेमाल करता है.

इन लाइब्रेरी का इस्तेमाल, J2ObjC के JRE सेटिंग में किया जाता है. इन्हें आपके ऐप्लिकेशन से लिंक करना पड़ सकता है.

लाइब्रेरीलिंक फ़्लैगब्यौरा
zip -l z इसका इस्तेमाल java.util.zip में किया जाता है. अगर jre_zip को लिंक किया जा रहा है, तो आपको यह जानकारी शामिल करनी होगी.
सुरक्षा -फ़्रेमवर्क सुरक्षा jre_security लिंक करने के लिए ज़रूरी है.

लाइब्रेरी सर्च पाथ

J2ObjC के डिस्ट्रिब्यूशन में कई स्टैटिक लाइब्रेरी शामिल होती हैं. इनका इस्तेमाल करने के लिए, आपके प्रोजेक्ट को लिंकर को बताना होगा कि उन्हें कहां ढूंढना है.

आम तौर पर, लाइब्रेरी के खोज पाथ में _$(j2objcdistribution)/lib शामिल होनी चाहिए. इसमें _$(j2objcdistribution) वैरिएबल, J2ObjC की आपकी लोकल कॉपी का पाथ होता है. उदाहरण के लिए, अगर आपने किसी J2ObjC रिलीज़ संग्रह फ़ाइल को "/usr/local/" में अनज़िप किया है, तो यह पाथ "/usr/local/j2objc" होगा.

अहम जानकारी: अपने प्रोजेक्ट में _$(j2objcdistribution) का इस्तेमाल न करें. हमेशा उस पाथ की जानकारी दें जहां आपने J2ObjC इंस्टॉल किया है.

अगर J2ObjC को इसके सोर्स कोड की कॉपी से बनाया जाता है, तो _$(j2objcdistribution) आपकी कॉपी की "j2objc/dist/" डायरेक्ट्री होगी. जब तक आप make dist के साथ J2ObjC नहीं बना लेते, तब तक यह डायरेक्ट्री मौजूद नहीं रहेगी.

Xcode: लाइब्रेरी सर्च पाथ

_$(j2objcdistribution)/lib जोड़कर ऐप्लिकेशन टारगेट के लाइब्रेरी खोज पाथ को अपडेट करें (फिर से, असली पाथ का इस्तेमाल करें).

JRE लाइब्रेरी

ये लाइब्रेरी, J2ObjC के JRE एम्युलेशन से तय की गई क्लास लागू करती हैं.

ध्यान दें: libjre_core.a लाइब्रेरी में ज़्यादातर अन्य सबसेट की लाइब्रेरी की क्लास होती हैं. हमारा सुझाव है कि आप ऐप्लिकेशन का साइज़ कम करने का सुझाव यह है कि आप ऐप्लिकेशन को -l jre_core से जोड़ें. इसके बाद, सबसेट लाइब्रेरी को जोड़ें, ताकि जिन चिह्नों की पहचान नहीं हो पाई है उन्हें हटा दिया जाए. उदाहरण के लिए, सबसे ज़्यादा इस्तेमाल की जाने वाली java.io क्लास libjre_core.a में होती है. इसलिए, libjre_io.a लाइब्रेरी को सिर्फ़ तब शामिल करें, जब सिंबल से जुड़ी ऐसी गड़बड़ियां मौजूद हों जिन्हें हल नहीं किया गया हो और जिनके नाम JavaIo से शुरू होते हैं.

लाइब्रेरीलिंक फ़्लैगब्यौरा
libjre_core.a -l jre_core क्लास का कम से कम सेट J2ObjC के JRE इम्यूलेशन के लिए ज़रूरी है, जिसका संदर्भ सभी जनरेट की गई सोर्स फ़ाइलों में दिया जाता है. अगर आपके अनुवाद किए गए Java सोर्स, नेटवर्किंग, एक्सएमएल, एसक्यूएल वगैरह जैसी चीज़ों के लिए JRE सहायता का रेफ़रंस देते हैं, तो आपको दूसरी लाइब्रेरी (नीचे दी गई हैं) भी लिंक करनी होंगी.
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_एसएसएल 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 एक्सएमएल से जुड़े पैकेज की सभी क्लास. इसमें javax.xml.*, org.w3c.dom.*, और org.xml.sax.* शामिल हैं.
libjre_zip.a -l jre_zip java.util.zip और java.util.jar पैकेज की सभी क्लास. इसे जोड़ने पर, आपको SDK टूल की ZIP लाइब्रेरी भी जोड़नी होगी. (SDK टूल की लाइब्रेरी देखें)

libjre_emul.a (-l jre_emul)

jre_emul लाइब्रेरी में, J2ObjC के JRE एम्युलेशन में शामिल सभी क्लास शामिल हैं. अगर कोई ऐप्लिकेशन jre_emul से जुड़ा है, तो दूसरी कोई भी jre_* लाइब्रेरी शामिल नहीं होनी चाहिए. ऐसा न होने पर, लिंकर डुप्लीकेट सिंबल की गड़बड़ियों की रिपोर्ट करेगा. ऐसा इसलिए है, क्योंकि jre_emul में उन दूसरी लाइब्रेरी में बताई गई सभी क्लास शामिल होती हैं.

अन्य J2ObjC लाइब्रेरी

इन Java लाइब्रेरी और Android के इस्तेमाल की क्लास को, J2ObjC डिस्ट्रिब्यूशन में स्टैटिक लाइब्रेरी के तौर पर शामिल किया जाता है:

लाइब्रेरीलिंक फ़्लैगब्यौरा
libguava.a -l अमरूद Guava: Java के लिए Google Core Library
libjavax_inject.a -l javax_inject JSR-330 डिपेंडेंसी इंजेक्शन एनोटेशन लाइब्रेरी.
libjson.a -l json JSON डेटा इंटरचेंज लाइब्रेरी. यह JSON का Android वर्शन है, जो इसे लागू करने के दूसरे तरीकों से थोड़ा अलग है.
libjsr305.a -ली jsr305 सॉफ़्टवेयर में खराबी का पता लगाने वाली लाइब्रेरी के लिए, JSR-305 एनोटेशन.
libjunit.a -l जून -ObjC JUnit टेस्ट फ़्रेमवर्क.
libmockito.a -l मॉकिटो -ObjC Java में यूनिट टेस्ट के लिए, Mockito मॉकिंग फ़्रेमवर्क.
libprotobuf_runtime.a -l protobuf_runtime Google प्रोटोकॉल बफ़र रनटाइम, जो J2ObjC ऐप्लिकेशन के लिए ऑप्टिमाइज़ किया गया है. J2ObjC प्रोटोबफ़ का इस्तेमाल करने वाले ऐप्लिकेशन को अपनी प्रोटो फ़ाइलों को j2objc_protoc के साथ कंपाइल करना चाहिए.
libandroid_util.a -l android_util `android_util` लाइब्रेरी में Android API यूटिलिटी क्लास का एक छोटा सबसेट शामिल है. इसका मकसद Android एनवायरमेंट के लिए एम्युलेट करना नहीं है, बल्कि `android.util.Log` जैसी काम की क्लास शेयर करने का सिर्फ़ एक तरीका है.

iOS ऐप्लिकेशन को लिंक करते समय अक्सर -ObjC फ़्लैग का इस्तेमाल किया जाता है. हालांकि, इसकी ज़रूरत सिर्फ़ तब होती है, जब ऑब्जेक्टिव सी क्लास और कैटगरी को स्टैटिक लाइब्रेरी से डाइनैमिक तौर पर लोड करने की ज़रूरत हो. इस फ़्लैग की वजह से, लिंक की गई सभी स्टैटिक लाइब्रेरी की सभी क्लास को ऐप्लिकेशन में शामिल किया जा सकता है, चाहे उनका इस्तेमाल असल में हुआ हो या नहीं. इसलिए, हमारा सुझाव है कि J2ObjC का इस्तेमाल करने वाले ऐप्लिकेशन सिर्फ़ तब -ObjC फ़्लैग के साथ लिंक करें, जब रनटाइम के दौरान क्लास लोड नहीं हो पातीं (इसका एक लक्षण JavaLangClassNotFoundException के थ्रो होने पर होता है).

JUnit और Mockito टेस्ट फ़्रेमवर्क काफ़ी हद तक रिफ़्लेक्शन पर निर्भर करता है. इसलिए, उनका इस्तेमाल करने वाले टेस्ट ऐप्लिकेशन को -ObjC से लिंक करना चाहिए.

पूरी स्टैटिक लाइब्रेरी से लिंक करने का एक विकल्प यह है कि कुछ क्लास को डाइनैमिक तौर पर लोड किया जा सके. इसके बजाय, उन क्लास का स्टैटिक तौर पर रेफ़रंस दें. Java में, यह स्टैटिक इनीशियलाइज़र ब्लॉक में किया जा सकता है; यहां J2ObjC की IosSecurityProvider क्लास से एक उदाहरण दिया गया है:

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