2014-04-08 16 views
9

एंड्रॉइड उर्फ-देशी कोड (जावा कोड) को एक्समरिन प्रोजेक्ट में एकीकृत किया जा सकता है। आधिकारिक तरीके this article में सूचीबद्ध हैं।.jar एंड्रॉइड लाइब्रेरी Xamarin प्रोजेक्ट में आयात

हम लेख में वर्णित जावा लाइब्रेरी बाइंडिंग दृष्टिकोण का उपयोग करने का प्रयास कर रहे हैं। विशेष रूप से इस प्रश्न के लिए Our test andoid library is published on Github

हमने इसे एंड्रॉइड डेवलपर टूल में जावा एंड्रॉइड लाइब्रेरी के रूप में स्थापित करने में बनाया है। यह एक्लिप्स में एक .jar प्रारूप में बनाया गया है जो ज़ैमरिन साइट पर ट्यूटोरियल पर्याप्त मानता है।

यदि हम विजुअल स्टूडियो में हमारी परियोजना में .jar को बांधने की कोशिश कर रहे हैं, तो ऑब्जेक्ट एक्सप्लोरर हमें बाध्यकारी एस्सेबी के नामस्थान दिखाएगा, लेकिन कोड में, हालांकि असेंबली का संदर्भ दिया गया है, हम विधियों और कक्षाओं तक नहीं पहुंच सकते नामस्थान में, हमारे परीक्षण जावा एंड्रॉइड lib में गिरावट ..

दूसरी तरफ, जब हम लगभग किसी भी .jar लेते हैं, जो इंटरनेट पर एंड्रॉइड लाइब्रेरी है (उदाहरण के लिए this one), हम इसे बांध सकते हैं और एक्सेस कर सकते हैं यह बिना किसी समस्या के तरीकों है।

कृपया दो .jar की तुलना करें और यदि संभव हो, तो मुझे बताएं कि हमारे परीक्षण एंड्रॉइड लाइब्रेरी में गिटूब पर क्या गलत है, जिससे हमारे नामस्थान कोड से अनुपलब्ध हो जाते हैं।

+0

क्या आपको "एंड्रॉइड लाइब्रेरी" या सिर्फ नियमित पुस्तकालय की आवश्यकता है? आपका उदाहरण जार एंड्रॉइड लाइब्रेरी नहीं है, यह एक स्टैंडआर्ट जावा लाइब्रेरी है जिसमें संकलित कक्षा का समूह शामिल है। यहां अंतर यह है कि एंड्रॉइड लाइब्रेरी में जावा कोड न साझा करने के लिए संसाधन शामिल हैं। चूंकि आपका उदाहरण Test.java में एंड्रॉइड के बारे में कुछ भी नहीं है, इसलिए आप इसे संकलित और जार कर सकते हैं। –

+0

* .jar से * .zip का नाम बदलने पर आप अंदर देखने के लिए किसी भी संग्रह उपकरण का उपयोग कर सकते हैं। एंड्रॉइड आवश्यकताओं के बारे में नहीं जानते लेकिन आपके गिटहब..बिन/ए 2 डीपी.जर में मेटा-आईएनएफ/मेनफैस्ट.एमएफ शामिल है जिसमें दो बाइट्स हैं, इसलिए यह एक कंपाइलर समस्या की तरह दिखता है, कृपया असली जार प्रदान करें – xmojmr

उत्तर

3

प्रयास करना चाहिए मैं, एक ही Binding a Java Library लेख तुमने पढ़ा निर्देश माध्यम से चला गया है, और कोई निर्माण में त्रुटियां थीं। जब मैंने अपनी जार फ़ाइल से कक्षाओं का उपयोग करने का प्रयास किया, तो इंटेलिजेंस कुछ भी पहचान नहीं रहा था। फिर मैंने API Metadata Reference पर फॉलो-ऑन आलेख पढ़ा। यह मुझे सोच रहा है कि शायद मुझे ट्रांसफॉर्म/मेटाडाटा.एक्सएमएल फ़ाइल को संपादित करने का प्रयास करना चाहिए। पैकेज के नाम को शामिल करने के लिए संक्षेप में संपादन के बाद, विजुअल स्टूडियो को जार फ़ाइल से कक्षा के संदर्भ में (संकलन के बाद) अनुमति दी गई। फिर मैंने कक्षा से एक विधि को कॉल करने का प्रयास किया, और फिर, एक और कंपाइलर त्रुटि मिली। तो, मैं मेटाडाटा.एक्सएमएल फ़ाइल में वापस गया और प्रश्न में विधि का नाम बदलने के लिए एक प्रविष्टि जोड़ा। मैंने अपना नाम बदलकर विधि को कॉल करने के लिए संपादित किया, और विजुअल स्टूडियो संकलित जुर्माना लगाया। मैंने इस कॉल को यूनिट टेस्ट केस में एकीकृत किया, और यह पारित हो गया!

मेरे पढ़ने से, मेटाडाटा.एक्सएमएल फ़ाइल को संपादित करना आवश्यक नहीं था, लेकिन कम से कम मेरे अनुभव में यह आवश्यक लग रहा था। यह obj/release/api.xml फ़ाइल पर XPATH का उपयोग करता है (जैसा कि API Metadata Reference में बताया गया है)। उस आलेख से पैकेज & विधि नाम दोनों का नाम बदलने के लिए उदाहरण थे, इसलिए मेरे मेटाडाटा.एक्सएमएल फ़ाइल में डालने के लिए यह मेरे लिए बहुत अधिक काम नहीं था। इसके अलावा, मैंने Binding a Java Library आलेख से OsmBindingDroidExample डाउनलोड किया और अपनी मेटाडाटा.एक्सएमएल फ़ाइल भी जांच ली।

यहाँ के रूप में अच्छी संदर्भ के लिए मेरी एक्सएमएल है: मेरी नेट कोड में

<metadata> 
    <attr path="/api/package[@name='com.abc.def']" name="managedName">MyRenamedPackage</attr> 
    <attr path="/api/package[@name='com.abc.def']/class[@name='MyClass']/method[@name='originalJavaMethod']" name="managedName">RenamedDotNetMethod</attr> 
</metadata> 

तो, अब, मैं लिख सकते हैं:

MyRenamedPackage.MyClass.RenamedDotNetMethod(...); 

आशा इस मदद करता है!

संपादित करें:

मैं Xamarin टूलकिट से अधिक परिचित एक सा मिल गया है, और इस उपयोग को आसान बना के लिए एक अद्यतन है।

जार विधियों के साथ बातचीत करने की आवश्यकता वाले कोड की भागीदारी को सीमित करने के लिए, Xamarin आपको जोड़ों फ़ोल्डर में सी # कक्षाएं बनाने की अनुमति देता है।इसलिए, मैंने एक रैपर वर्ग बनाया जो एक प्रबंधित सी # कक्षा में विधियों का खुलासा करता है जो अन्य परियोजनाएं एक्सेस कर सकती हैं। चूंकि यह सी # दृश्य स्टूडियो से कोई शिकायत नहीं है। ,

public class InovcationWrapper 
{ 
    public static void InvokeMethod(...) 
    { 
     MyRenamedPackage.MyClass.RenamedDotNetMethod(...); 
    } 
} 
फिर अपनी परियोजना कोड में

आप चाहते हैं:

यहाँ एक आवरण वर्ग मेरी पहले उदाहरण के साथ जा रहा तरह दिखाई देगा (जाहिर है आप हाथ में कार्य करने के लिए और अधिक सार्थक एक नाम चुनते थे)

InvocationWrapper.InvokeMethod(...); 

यह बहुत आसान है के साथ काम करने में आता है और लाल squiggles की राशि अपने कोड में ध्यान नहीं दिया जा करने के लिए सीमित करता है: अगर आप सिर्फ अपने आवरण वर्ग फोन पूर्ण IntelliSense की है। उम्मीद है की यह मदद करेगा!

संबंधित मुद्दे