2010-07-27 8 views
11

मैं अपने एंड्रॉइड एप्लिकेशन के भीतर addJavascriptInterface का उपयोग कर रहा हूं ताकि जावास्क्रिप्ट को मेरे मूल जावा एप्लिकेशन में बनाए गए कार्यों को आमंत्रित करने की अनुमति मिल सके।एनपीओब्जेक्ट पर विधि कॉल करने में त्रुटि! एंड्रॉइड 2.2

यह एंड्रॉइड 2.1 में अच्छा काम करता है, हालांकि एंड्रॉइड 2.2 में मुझे त्रुटि संदेश मिलता है "एनपीओब्जेक्ट पर विधि कॉल करने में त्रुटि!"

जब मैं विधि कॉल का वाद्य यंत्र करता हूं तो देशी विधि के आंतरिक को बुलाया जाता है, हालांकि अपवाद जावास्क्रिप्ट में फेंक दिया जा रहा है।

+0

मुझे एक ही समस्या है। क्या आपने इसे हल करने में कामयाब रहे? – grzaks

उत्तर

1

मुझे जावास्क्रिप्ट-टू-जावा इंटरफ़ेस (WebView.addJavascriptInterface) के साथ एक ही समस्या थी।

एंड्रॉइड 2.1 में सबकुछ ठीक काम करता है लेकिन एंड्रॉइड 2.2 में जावास्क्रिप्ट इस इंटरफ़ेस से विधियों को कॉल करने में विफल रहा। यह एक त्रुटि लौटा: Uncaught Error: Error calling method on NPObject!

ऐसा लगता है कि एंड्रॉइड 2.2 पर, WebView में इंटरफ़ेस फ़ंक्शंस से लौले गए बूलियन डेटा प्रकार के साथ समस्या है।

बदलना:

public Boolean test_func() { return true; } 

... करने के लिए:

public int test_func() { return 1; } 

... समस्या हल हो।

+1

बूलियन के बजाय बूलियन का उपयोग करके – NikoRoberts

5

मेरे अनुभव में यह समस्या जावास्क्रिप्ट इंटरफेस के कारण होती है जो जावास्क्रिप्ट स्वचालित रूप से पहचान नहीं लेती है।

एंड्रॉयड में इस रैपर द्वारा की तरह बूलियन या लांग तुलना में उनके मूल संस्करण बूलियन और लंबे के कारण होता है।

//This will fail 
public Long getmyLongVal() { 
    return 123456789; 
} 

//This will work 
public long getMyNativeLongVal() { 
    return 123456789; 
} 

तो अगर आप NPObject त्रुटियों से बचने के लिए चाहते जावास्क्रिप्ट द्वारा किया जा रहा है किसी भी तरीकों को अपने आवरण वर्गों को हटा दें।

11

मैं इस सटीक त्रुटि हो रही थी:

Uncaught Error: Error calling method on NPObject!

बाहर कर देता है मैं तो जैसे वेब दृश्य से एक JavascriptInterface समारोह आह्वान करने के लिए प्रयास कर रहा था:

AndroidJS.populateField(field);

और जावा की ओर , फ़ंक्शन ने पैरामीटर स्वीकार नहीं किया:

public void populateField() {}

बस जावा फ़ंक्शन को मेरे लिए इस त्रुटि को हल करने वाले पैरामीटर को स्वीकार करने की इजाजत देता है।

जैसे, public void populateField(String field) {}

यह नहीं हो सकता है, और शायद, एकमात्र कारण यह त्रुटि फेंक दिया जा सकता है नहीं है। यह बस मैंने अपने विशिष्ट परिदृश्य को कैसे हल किया है। उम्मीद है की यह मदद करेगा!:)

0

यह मेरा मानना ​​है कि अब और समर्थित नहीं है (हमेशा गेम एनपीओब्जेक्ट त्रुटि)। कृपया इस धागे में उत्तर पर जाएं open an activity from a CordovaPlugin

5

ठीक है, मुझे आज भी एक ही समस्या है।

क्या मैं था यूआई थ्रेड में कोड डाल रहा है, नीचे दिए गए कोड की तरह:

/** 
* 給網頁Javascript呼叫的method 
* Method for Javascript in HTML 
* @param java.lang.String - Playlist ID 
*/ 
public int callListByPID(final String pId) 
{ 
    Log.i(Constants.TAG, "PAD Playlist ID from HTML: "+pId); 

    runOnUiThread(new Runnable() 
    { 
    public void run() 
    { 
     // Put your code here... 
    } 
    }); 

    return 1; 
} 

यह मेरी समस्या हल, और आशा है कि यह शरीर के कुछ मदद कर सकते हैं ... :-)

+0

बहुत अच्छा समाधान काम करता है - धन्यवाद आरआरटीएक्स – bkurzius

2

यहाँ एक मोड़ है मुझे इस समस्या पर पाया गया है जो इस समस्या में चल रहे कुछ लोगों के लिए उपयोगी हो सकता है (और यह संभवतः स्पष्टीकरण को अस्वीकार करने के लिए असंतुलित असफलताओं को समझाता है) ...

यदि कोई अपवाद फेंक दिया जाता है (और पकड़ा नहीं जाता है) जावास्क्रिप्ट इंटरफेस की अनुमति देने से पहले हैंडलर कोड वापस करें कॉलबैक साफ़ करने के लिए, यह एक असफल कॉल के रूप में वापस प्रचार करेगा और आपको यह त्रुटि भी मिल जाएगी - और इसमें लापता कार्यों या पैरामीटर के साथ कुछ भी नहीं होगा।

इस मामले को खोजने का सबसे आसान तरीका (चाहे आप इसे अंतिम कार्यान्वयन में उपयोग करते हैं या नहीं) यूआई थ्रेड पर वापस जो भी हैंडलर कोड वापस लेना है (कॉलबैक यूआई थ्रेड पर नहीं होगा) - यह होगा कॉलबैक को वापस लौटने की अनुमति दें और बाद में होने वाले किसी भी अपवाद को तब तक ठीक से प्रसारित किया जाएगा जब तक कि आप उन्हें पकड़ न लें या ऐप क्रैश न हो जाए। किसी भी तरह से आप वास्तव में क्या देख रहे हैं वास्तव में देखेंगे। अन्यथा अनकही अपवाद जावास्क्रिप्ट पर वापस जाता है जहां इसे किसी भी तरह से संभाला या रिपोर्ट नहीं किया जाएगा (जब तक कि आपने विशेष रूप से जेएस में त्रुटि फंसे कोड को बनाया नहीं है)।

शुभकामनाएं सभी।

बीएच

+0

ठीक है, बहुत अच्छा लगता है लेकिन हम यह कैसे कर सकते हैं? हम ui धागे पर हैंडलर कोड कैसे दबा सकते हैं? –