2013-05-14 12 views
5

मैं Xamarin के दस्तावेज़ों में directions के बाद Xamarin.Android प्रोजेक्ट में एक स्थिर लाइब्रेरी (foo.a) - जिसमें C++ कोड शामिल है, को जोड़ने का प्रयास कर रहा हूं। न तो "पथ स्नीफिंग विधि", न ही "प्रोजेक्ट फ़ाइल के भीतर एबी तत्व" विधि काम करने लगती है।Xamarin.Android: आप एक स्थिर पुस्तकालय को कैसे लिंक करते हैं?

किसी भी विधि का उपयोग करते हुए जब मैं पुस्तकालय कार्यों में कॉल करने का प्रयास मैं अपवाद बिना क्रिया मिलती है:

I/mono(2591): [ERROR] FATAL UNHANDLED EXCEPTION: System.EntryPointNotFoundException: ... 

मैं उल्लेख करना चाहिए कि मैं कोई परेशानी नहीं जोड़ने और इस पुस्तकालय में बुला पड़ा है (ARMv7 के लिए बनाया गया है, armv7s) "अतिरिक्त mtouch तर्क" का उपयोग कर मेरी Xamarin.iOS प्रोजेक्ट के साथ -cxx विधि here वर्णित है। मेरे सभी DLLImports प्लेटफॉर्म पर समान हैं ...

[DllImport(Import.lib, CallingConvention=CallingConvention.Cdecl)] 
internal static extern IntPtr FooMethodName(args); 

तो, मुझे क्या याद आ रही है?

FYI करें: मैं Xamarin स्टूडियो 4.0.5 का उपयोग कर रहा है (4 का निर्माण), Xamarin.Android 4.6.4 (व्यावसायिक संस्करण)

+0

से MyLibrary.MyFunction() को कॉल करने में सक्षम होना चाहिए यदि आप DllImport ("__ आंतरिक") काम कर सकते हैं तो यह काम कर सकता है – tofutim

उत्तर

7

मुझे पता है इस सवाल का एक वर्ष से अधिक पुराना है, लेकिन जब से मैं हाल ही में किया था ठीक है, और मेरे सिर को उसी स्थान पर दबाएं, मुझे वैसे भी जाना होगा ...

टीएल; डीआर: आप एंड्रॉइड के लिए एक्समारिन के साथ स्थिर पुस्तकालयों को लिंक नहीं कर सकते हैं, आप केवल गतिशील पुस्तकालयों को जोड़ सकते हैं (.so)

कदम:

  • यदि आपकी लाइब्रेरी सी में लिखी गई है तो आप पहले चरण को छोड़ सकते हैं। लेकिन अगर आपका lib सी ++ में लिखा गया है तो आपको पहले अपने सार्वजनिक रूप से निर्यात किए गए कार्यों को अपने कोड में सी-फ़ंक्शंस के रूप में घोषित करना होगा (यानी आपको उन्हें # वैकल्पिक "सी" {} ब्लॉक के अंदर रखना होगा)। यदि आप ऐसा नहीं करते हैं तो आपके फ़ंक्शन नाम C++ नाम मैंगलिंग के अधीन होंगे और Xamarin उन्हें ढूंढने में सक्षम नहीं होंगे।
extern "C" 
{ 
    void my_function(bool someParameter); 
} 
  • एंड्रॉयड NDK का उपयोग करना, एक गतिशील लिंक लाइब्रेरी के लिए आपकी लाइब्रेरी संकलन (.so)। एक स्थिर पुस्तकालय (.a) नहीं करेगा। यह वह जगह है जहां मैंने अपना सिर मारा, क्योंकि यह दस्तावेज से स्पष्ट नहीं है। भ्रम में जोड़ना, आईओएस पर यह सटीक विपरीत है: आप स्थैतिक .a libs केवल लिंक कर सकते हैं (ऐपस्टोर नीतियों के अनुसार)। पर मैं तुम्हें .so पुस्तकालयों, प्रत्येक प्रोसेसर आर्किटेक्चर के लिए एक का एक सेट है मान
  • प्रत्येक प्रोसेसर आर्किटेक्चर आप का समर्थन करना चाहते हैं (आमतौर पर, armeabi, armeabi-v7a और x86)
  • के लिए ऐसा करें यहाँ से। पुस्तकालयों का नाम libX.so है, जहां एक्स आपकी लाइब्रेरी का प्रोजेक्ट नाम है। जैसे "Libmylibrary.so"।
  • अपने ज़ैमरिन एंड्रॉइड प्रोजेक्ट में, प्रोजेक्ट रूट के नीचे एक फ़ोल्डर "libs" जोड़ें। (यदि आप चाहें तो आप दूसरे नाम का भी उपयोग कर सकते हैं)
  • फ़ोल्डर "libs" के नीचे, क्रमशः "armeabi", "armeabi-v7a" और "x86" नामक तीन बाल फ़ोल्डर बनाएं। इन सभी फ़ोल्डरों में से प्रत्येक को अपनी .so फ़ाइलों में से एक को कॉपी करें (एक ही प्रोसेसर आर्किटेक्चर से संबंधित)। यह Xamarin "पथ स्नीफिंग" सुविधा को सक्षम बनाता है जो सही प्रोसेसर आर्किटेक्चर के लिए सही लाइब्रेरी का चयन करेगा।
  • तीन शामिल करें।इसलिए "एक्शन बनाएँ" संपत्ति अपनी परियोजना में और हर एक सेट के लिए फ़ाइलें "AndroidNativeLibrary"
  • अब उचित DllImport के साथ एक Xamarin वर्ग के लिए स्थिर तरीके के रूप में प्रवेश कार्यों को जोड़ने में जिम्मेदार बताते हैं:
namespace MyApp 
{ 
    public static class MyLibrary 
    { 
     [DllImport("libmylibrary", EntryPoint = "my_function")] 
     public static extern void MyFunction(Boolean someParameter); 
    } 
} 
  • यही वह है। अब आप अपने Xamarin सी # कोड
संबंधित मुद्दे