2012-02-01 21 views
5

में एक वस्तु परिणाम देने मैं एक जावा समारोह जो एक कक्षाJNI जावा समारोह के लिए कॉल NoSuchMethodError

public static synchronized MyClass getInstance() throws MyClassException{ 
    if (instance == NULL){ 
     // create 
    } 
    return instance; 
} 

मैं सी के माध्यम से इस कॉल करना चाहते हैं ++ कोड की एक सिंगलटन उदाहरण देता है, लेकिन जब मैं करते हैं, यह रिटर्न एक NoSuchMethodError।

cls = jenv->FindClass("MyClass"); 
if (cls == NULL) 
{ 
//error handling 
} 
mid = jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass"); 
if (mid == NULL) 
{ 
//error handling 
} 

जब मैं चलाएँ:

javap -s -p on MyClass, I get the signature: 
public static synchronized MyClass getInstance() throws MyClassException; 
Signature:()LMyClass; 

अगर मैं समारोह हस्ताक्षर जावा वर्ग में शून्य करने के लिए बदलने के लिए, GetStaticMethodID कॉल अपेक्षा के अनुरूप काम करता है।

क्या मुझे कॉल से वापसी मूल्य की अपेक्षा करने के लिए नौकरी निर्धारित करने की आवश्यकता है?

क्या यह पहले GetStaticMethodID को कॉल किए बिना संभव है?

+0

कॉल कहां त्रुटि दे रहा है? –

+0

जब मैं सी ++ ऐप चलाता हूं, तो मुझे मिलता है: थ्रेड में अपवाद "मुख्य" java.lang.No.SuchMethodError: getInstance – donalmg

+0

मुझे आश्चर्य है कि आपको GetStaticMethodId पर कॉल में "MyClass" के पूर्ण योग्यता वाले पथ को निर्दिष्ट करने की आवश्यकता है या नहीं। उदाहरण के लिए: जेएनवी-> GetStaticMethodID (cls, "getInstance", "() Lcom/work/MyClass;"); सीपीपी कोड जावा कोड के सापेक्ष कहां रहता है इस पर निर्भर करता है? सिर्फ एक विचार। मेरे मूल प्रश्न में – eternaln00b

उत्तर

1

मुझे विश्वास है कि समस्या यह है कि यह निर्दिष्ट आउटपुट तर्क को हल करने में असमर्थ है। यदि आपका जावा क्लास पैकेज में था: "कॉम/वर्क /", आप कहेंगे:

jenv->GetStaticMethodID(cls, "getInstance", "()Lcom/work/MyClass;"); 

ऐसा करना चाहिए।

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

ऐसा लगता है कि इस सवाल का जवाब javap के उत्पादन में किया जाता है है ना? आपको करना चाहिए:

jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass;"); 
+0

टाइपो। मेरे पास यह **() LMyClass ** – donalmg

+0

था और आपने स्पष्ट रूप से कहा "() LMyClass;" अंत में सेमी-कोलन के साथ? – eternaln00b

+0

उदाहरण के लिए, मैं कर सकता हूं: getStaticMethodID (cls, "currentThread", "() ljava/lang/thread;"); और यह ठीक काम करता है। क्या ये तुम्हारे लिए कारगर है? – eternaln00b

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