ज़्यादातर Xcode प्रोजेक्ट में, बिल्ड के नियम लागू होते हैं. इससे डेवलपर, मौजूदा फ़ाइल टाइप को बनाने के तरीके और नए फ़ाइल टाइप को बनाने के तरीके में बदलाव कर सकते हैं. J2ObjC स्क्रिप्ट, जान-बूझकर Xcode जैसे बिल्ड सिस्टम में प्लग इन करने के लिए डिज़ाइन की गई हैं.
j2objc-sample-reversi प्रोजेक्ट किसी आसान iOS गेम में Java के स्रोत जोड़ने के तरीके का उदाहरण है.
कम से कम बिल्ड के लिए बिल्ड सेटिंग अपडेट करना और फिर J2ObjC बिल्ड नियम जोड़ना ज़रूरी होता है.
बिल्ड की सेटिंग अपडेट करें
- प्रोजेक्ट एडिटर खोलने के लिए प्रोजेक्ट नेविगेटर में प्रोजेक्ट पर क्लिक करें और पक्का करें कि ऐप्लिकेशन टारगेट चुना गया हो.
- बिल्ड सेटिंग टैब पर क्लिक करें.
-ljre_emul
को अन्य लिंकर फ़्लैग में जोड़कर, JRE इम्यूलेशन लाइब्रेरी (jre_emul
) को लिंक करें. यह ऐसा दिखना चाहिए:- + पर क्लिक करके, उपयोगकर्ता के हिसाब से तय की गई सेटिंग जोड़ें चुनें.
- सेटिंग को
J2OBJC_HOME
नाम दें और इसकी वैल्यू को J2ObjC की लोकेशन पर सेट करें. यह या तो रिलीज़ ज़िप को अनज़िप करने वाला फ़ोल्डर होना चाहिए या अगर आपने सोर्स से कंपाइल किया है और आपका रूटj2objc
है, तोj2objc/dist
फ़ोल्डर होना चाहिए. - सर्च पाथ में, इन चीज़ों में बदलाव करें:
- फ़्रेमवर्क खोज पथ में
${J2OBJC_HOME}/frameworks
जोड़े जाते हैं - लाइब्रेरी सर्च पाथ में, हर बिल्ड कॉन्फ़िगरेशन के लिए
${J2OBJC_HOME}/lib
जोड़ें. - उपयोगकर्ता हेडर सर्च पाथ में
${J2OBJC_HOME}/include
जोड़ें.
- फ़्रेमवर्क खोज पथ में
J2OBJC_HOME
खोजकर अपनी सेटिंग की पुष्टि करें. आपको इससे मिलता-जुलता कुछ दिखेगा:
J2ObjC बिल्ड नियम जोड़ना
अपनी Java सोर्स फ़ाइलों की रूट डायरेक्ट्री तय करें, जिसे हम
$source-root
कॉल करेंगे. रूट डायरेक्ट्री वह डायरेक्ट्री होती है जिसमें आपकी सोर्स फ़ाइलों का सबसे ऊपर मौजूद पैकेज होता है.अगर आपको git का इस्तेमाल करना है और आपको किसी दूसरे git प्रोजेक्ट से Java फ़ाइलें हासिल करनी हैं, तो आपके पास अपने Java सोर्स के साथ प्रोजेक्ट को ट्रैक करने के लिए, एक सबमॉड्यूल जोड़ने का विकल्प है. उदाहरण के लिए, मान लें कि आपका Xcode प्रोजेक्ट (xcodeproj)
~/dev/MyProject
में है, तो हो सकता है कि आपके Objective-C सोर्स के साथ कोई दूसरीMyProject
डायरेक्ट्री हो. अपने ऑब्जेक्टिव-सी सोर्स के ठीक बगल में, अपने Java प्रोजेक्ट के सोर्स के साथ~/dev/MyProject/MyProject/javaproject
डायरेक्ट्री बनाने के लिए,~/dev/MyProject/MyProject
डायरेक्ट्री मेंgit submodule add git@github.com:user/javaproject
चलाएं. इसके बाद, उस फ़ोल्डर कोMyProject
ग्रुप में अपने Xcode प्रोजेक्ट में खींचकर लाएं. इस ग्रुप में, Xcode आपके फ़ाइल सिस्टम की मिररिंग करता है.${PROJECT_DIR}/MyProject/javaproject/src
,$source-root
है.अगर आपके Java सोर्स, आपके Xcode प्रोजेक्ट में किसी ग्रुप या डायरेक्ट्री में हैं, तो
$source-root
${PROJECT_DIR}/__group_or_directory_name__
है.अगर आपको पता नहीं है कि ग्रुप या डायरेक्ट्री पर राइट क्लिक करें, तो डायरेक्ट्री को देखने के लिए Finder में दिखाएं और ऐब्सलूट पाथ का इस्तेमाल करें.
उदाहरण के लिए, अगर आपके पास
~/myproject/src
नाम की डायरेक्ट्री में Java पैकेजfoo.bar
है, तो उस पैकेज की Java फ़ाइलें~/myproject/src/foo/bar/**.java
में होनी चाहिए. इसका मतलब है कि~/myproject/src
आपके प्रोजेक्ट की रूट डायरेक्ट्री है.अगर Java सोर्स फ़ाइलें, Xcode प्रोजेक्ट के बाहर हैं, तो उन्हें टर्मिनल विंडो में लिस्ट करते समय इस्तेमाल किया गया पूरा पाथ डालें.
प्रोजेक्ट एडिटर खोलने के लिए प्रोजेक्ट नेविगेटर में प्रोजेक्ट पर क्लिक करें और पक्का करें कि ऐप्लिकेशन टारगेट चुना गया हो.
नियम बनाएं टैब पर क्लिक करें.
बिल्ड नियम जोड़ने के लिए + पर क्लिक करें.
नए नियम के प्रोसेस विकल्प के लिए, "Java सोर्स फ़ाइलें" चुनें. इस्तेमाल करना विकल्प "कस्टम स्क्रिप्ट:" होना चाहिए.
कस्टम स्क्रिप्ट टेक्स्ट बॉक्स में, इन्हें जोड़ें (इसकी जगह
$source-root
याद रखें):if [ ! -f "${J2OBJC_HOME}/j2objc" ]; then echo "J2OBJC_HOME is not correctly defined, currently set to '${J2OBJC_HOME}'"; exit 1; fi; "${J2OBJC_HOME}/j2objc" -d ${DERIVED_FILE_DIR} -sourcepath "$source-root" --no-package-directories -g ${INPUT_FILE_PATH};
आउटपुट फ़ाइलें पैनल में, + बटन पर क्लिक करें और जोड़ें:
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h
.+ बटन पर फिर से क्लिक करें और
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m
जोड़ें.
आपका काम पूरा हो जाने पर, सेटिंग पैनल कुछ ऐसा दिखाई देना चाहिए (ध्यान दें: 10.2 तक, Xcode अब भी DERIVED_FILES_DIR वैरिएबल को तय करता है, जो पुराने सिस्टम के साथ काम करने के लिए DERIVED_FILE_DIR जैसा होता है):
अतिरिक्त लाइब्रेरी लिंक करना
लिंक बनाने के चरण (Xcode के "लिंक बाइनरी विद लाइब्रेरी" बिल्ड फ़ेज़) में J2ObjC के खास फ़्लैग की ज़रूरत होती है, जो इस बात पर निर्भर करते हैं कि आपका ऐप्लिकेशन अनुवाद की गई Java क्लास का इस्तेमाल कैसे करता है. पूरी सूची के लिए ज़रूरी लिंक सेटिंग देखें. यहां कुछ उदाहरण दिए गए हैं जिन्हें आपको दूसरी लाइब्रेरी लिंक करने की ज़रूरत पड़ सकती है:
java.util.zip
पैकेज का इस्तेमाल करने के लिए, आपको अपने अन्य लिंकर फ़्लैग में-ljre_zip
को जोड़कर, libz.dylib लाइब्रेरी को लिंक करना होगा.- सुरक्षित हैश जनरेट करने के लिए, आपको अपने प्रोजेक्ट में सिक्योरिटी फ़्रेमवर्क जोड़ना होगा.
बिल्ड से जुड़ी समस्याओं को डीबग करना
अगर Xcode में यह तरीका बताया गया है, तो बिल्ड के काम न करने की शिकायत करने के लिए, समस्या का नेविगेट करने वाला टूल खोलें. इसके बाद, जानकारी की जांच करने के लिए, किसी गड़बड़ी पर क्लिक करें. इससे यह पता चलेगा कि कौनसा कमांड-लाइन स्टेटमेंट लागू किया गया था. यहां कुछ सामान्य गड़बड़ियां दी गई हैं:
क्लास हल नहीं की जा सकती - ज़्यादा संभावना है कि आपने जिस
$source-path
का इस्तेमाल किया था वह गलत था. चलाए गए कमांड में-sourcepath
विकल्प खोजें और पक्का करें कि यह आपकी Java सोर्स फ़ाइलों की रूट डायरेक्ट्री की ओर ले जाता हो."JreEmulation.h" फ़ाइल नहीं मिली - सबसे ज़्यादा संभावना है कि समस्या उपयोगकर्ता हेडर खोज पाथ की खराब वैल्यू है. पाथ के साथ
-I
विकल्प के लिए बिल्ड कमांड खोजें. अगर यह ठीक लगता है, तो पाथ को कॉपी करें (-I नहीं) और टर्मिनल विंडो में उस पाथ के साथls
चलाएं. इससे यह पुष्टि की जा सकेगी कि कहीं टाइपिंग की कोई गलती तो नहीं है."_IOSClass_FromClass", इससे संदर्भ लिया गया: या "_OBJCCLASS$_Java" - लाइब्रेरी के सर्च पाथ गलत हैं या फिर आप अन्य लिंकर फ़्लैग को
-ljre_emul
पर सेट करके, JRE इम्यूलेशन लाइब्रेरी को लिंक करना भूल गए हैं. आपको कुछ और लाइब्रेरी भी लिंक करनी पड़ सकती हैं.बिना जानकारी वाले सिंबल: _iconv* - ज़रूरी iconv की लाइब्रेरी में मौजूद लिंक.
अगर आपको अब भी समस्याएं आ रही हैं, तो j2objc-discuss ग्रुप से संपर्क करें.