लिंक बनाने के चरण (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` जैसी काम की क्लास शेयर करने का सिर्फ़ एक तरीका है. |
-ObjC लिंक फ़्लैग
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
};