2013-03-11 5 views
5

लेता सी ++/JNI से एक जावा विधि कॉल करने के। अधिक विशेष रूप से, मैं इस कक्षा के निर्माता को कॉल करने की कोशिश कर रहा हूं जो एक पैरामीटर के रूप में एंड्रॉइड संदर्भ लेता है। मेरे कन्स्ट्रक्टर के पास कोई पैराम नहीं है, तो मुझे सफलतापूर्वक कॉल करने में कोई समस्या नहीं है, लेकिन जब मैं पैरामीटर के रूप में आवश्यक संदर्भ शामिल करता हूं, तो मुझे नहीं पता कि मेरा जेएनआई हस्ताक्षर कैसा दिखना चाहिए और यह भी संदेह है कि यह संभव है क्योंकि मेरे पास भी नहीं है उस संदर्भ वस्तु तक पहुंच।कैसे जो मैं सी ++/JNI Android पर के माध्यम से एक जावा वर्ग में कॉल करने के लिए कोशिश कर रहा हूँ एक Android संदर्भ पैरामीटर

तो, मेरे सवाल है, यह संभव है एक जावा वर्ग है जो अपनी ही पैरामीटर के रूप में एक Android संदर्भ लेता है के निर्माता कॉल करने के लिए है? यदि हां, तो कैसे ? यदि नहीं, तो क्या कोई कामकाज है क्योंकि मुझे कुछ एंड्रॉइड एपीआई कक्षाओं तक पहुंचने के संदर्भ की आवश्यकता है।

+0

यह सहायता करता है [Android ndk/jni] के साथ C++ का उपयोग करें (http://stackoverflow.com/questions/6423078/use-c-with-android-ndk-jni)? – static

उत्तर

2

मैं आपके द्वारा बताए गए तरीके से संभव नहीं मानता। हालांकि, अपनी कक्षा की संरचना को जानने के लिए, आप हमेशा इसे सिंगलटन डब्ल्यू/एक स्थिर उदाहरण के रूप में बना सकते हैं जो आपकी गतिविधि शुरू होने पर तत्काल हो जाता है, जिससे कक्षा उस समय आवश्यक संदर्भ प्राप्त करती है। जब तक आप सी ++ से कॉल करने के लिए तैयार नहीं होते हैं, तब तक यह अनिवार्य रूप से वहां बैठेगा, लेकिन वास्तव में आपके अनुरोध w/संदर्भ की सेवा के लिए उपलब्ध होगा।

+0

धन्यवाद! पूरी तरह से काम किया! –

0

जब निर्माता की विधि आईडी हो रही, तो आप बस जो एक आप चाहते हैं निर्दिष्ट करने की आवश्यकता।

constructor = (*env)->GetMethodID(env, cls, "<init>", "()V"); 
object = (*env)->NewObject(env, cls, constructor); 

इसके बजाय, आप जब GetMethodID का उपयोग कर तर्क का प्रकार निर्दिष्ट और जब NewObject लागू में इसे पारित करना चाहते हैं: वर्तमान में, आप शायद की तरह कुछ कर रहे हैं।

constructor = (*env)->GetMethodID(env, cls, "<init>", "(Landroid/content/Context;)V"); 
object = (*env)->NewObject(env, cls, constructor, context); 
+0

धन्यवाद, लेकिन वाक्यविन्यास प्रदान करने के लिए ... कोई विचार अगर संदर्भ प्राप्त करना संभव है तो जावा विधि होने से पहले इसे पास किया जा सकता है? –

+0

आपको जावा क्लास में जैसे ही जावा से एक पास करना होगा। हालांकि यह संभव हो सकता है, यदि आप चालाक थे, आवेदन संदर्भ का पता लगाने के लिए, यह अच्छी डिजाइन नहीं है (और, अन्य चीजों के साथ, आपके वर्गों को कम परीक्षण योग्य बना देगा)। –

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

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