2010-07-27 12 views
11

Ich benutze addJavascriptInterface innerhalb meiner Android-Anwendung, damit JavaScript Funktionen aufrufen kann, die ich in meiner nativen Java-Anwendung erstellt habe.Fehler beim Aufrufen der Methode auf NPObject! in Android 2.2

Das funktionierte gut in Android 2.1, aber in Android 2.2 erhalte ich die Fehlermeldung "Fehler beim Aufruf von Methode auf NPObject!"

Wenn ich den Methodenaufruf instrumentiere, werden die Interna der nativen Methode aufgerufen, aber die Ausnahme wird in JavaScript geworfen.

+0

Ich habe das gleiche Problem. Hast du es geschafft, es zu lösen? – grzaks

Antwort

1

Ich hatte das gleiche Problem mit Javascript-to-Java-Schnittstelle (WebView.addJavascriptInterface).

In Android 2.1 funktionierte alles gut, aber in Android 2.2 konnte Javascript Methoden von dieser Schnittstelle nicht aufrufen. Es wurde ein Fehler zurückgegeben: Uncaught Error: Error calling method on NPObject!

Es scheint, dass das WebView auf Android 2.2 Problem mit Boolean-Datentyp hat, der von Schnittstellenfunktionen zurückgegeben wird.

ändern:

public Boolean test_func() { return true; } 

... bis:

public int test_func() { return 1; } 

... das Problem gelöst.

+1

mit Boolean anstelle von Boolean funktioniert auch – NikoRoberts

5

Nach meiner Erfahrung wird dieses Problem durch Javascript-Schnittstellen verursacht, die Objekte zurückbringen, die Javascript nicht automatisch identifiziert.

In Android wird dies durch Wrapper verursacht wie Boolean oder Lange im Vergleich zu ihren nativen Versionen boolean und lange.

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

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

So Ihre Wrapper-Klassen auf alle Methoden entfernen, indem Sie Javascript verwendet werden, wenn Sie NPObject Fehler vermeiden wollen.

11

Ich war genau dieses Fehler bekommen:

Uncaught Error: Error calling method on NPObject!

Es stellte sich heraus, dass ich versuchte, wie so eine JavascriptInterface Funktion von einem webview aufzurufen:

AndroidJS.populateField(field);

und auf der Java-Seite , die Funktion hat keinen Parameter akzeptiert:

public void populateField() {}

Das einfache zulassen, dass die Java-Funktion einen Parameter akzeptiert, löste diesen Fehler für mich.

Z. B. public void populateField(String field) {}

Dies kann nicht sein, und wahrscheinlich nicht der einzige Grund, warum dieser Fehler ausgelöst werden könnte. So habe ich mein spezifisches Szenario gelöst. Hoffe das hilft!:)

5

OK, ich habe auch gleiche Problem, nur in heute.

Was ich getan habe ist, Code in UI-Thread setzen, wie Code unten:

/** 
* 給網頁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; 
} 

Das ist mein Problem gelöst, und hoffen, kann es einige Körper helfen ... :-)

+0

großartige Lösung - vielen Dank RRTX – bkurzius

2

Hier ist ein Twist Ich fand auf dieses Problem, das für einige der Leute nützlich sein könnte, die in dieses Problem laufen (und es erklärt wahrscheinlich intermittierende Fehler, die Erklärung zu entkräften scheinen) ...

Wenn irgendwelche Ausnahmen geworfen werden (und nicht gefangen werden) Handler-Code zurückgeben, bevor die JavaScript-Schnittstelle zugelassen wird Callback, um sauber zurück zu geben, wird es als fehlgeschlagener Aufruf propagieren und Sie werden auch diesen Fehler bekommen - und es würde nichts mit fehlenden Funktionen oder Parametern zu tun haben. Der einfachste Weg, um diesen Fall zu finden (unabhängig davon, ob Sie ihn in Ihrer endgültigen Implementierung verwenden), ist, den Code, den Sie haben, in den UI-Thread zurückzudrängen (der Callback wird nicht im UI-Thread sein) Erlauben Sie, dass der Rückruf sauber zurückkehrt, und alle nachfolgenden Ausnahmen werden ordnungsgemäß weitergeleitet, bis Sie sie abfangen oder bis die App abstürzt. So oder so wirst du genau sehen, was wirklich passiert. Andernfalls wird die nicht abgefangene Ausnahme wieder an JavaScript übergeben, wo sie nicht behandelt oder gemeldet wird (es sei denn, Sie haben speziell in der von Ihnen ausgeführten JS Fehlerfangcode erstellt).

Alles Gute.

bh

+0

ok, klingt gut, aber wie genau können wir das tun? Wie können wir Handler-Code auf dem ui-Thread pushen? –

Verwandte Themen