2010-07-27 9 views
11

Sto usando addJavascriptInterface all'interno della mia applicazione Android per consentire a JavaScript di richiamare le funzioni che ho creato nella mia applicazione Java nativa.Metodo di chiamata errore su NPObject! in Android 2.2

Questo ha funzionato bene in Android 2.1, tuttavia in Android 2.2 ricevo il messaggio di errore "Errore nel chiamare il metodo su NPObject!"

Quando chiamo strumento la chiamata del metodo vengono chiamati internals del metodo nativo, tuttavia l'eccezione viene lanciata in JavaScript.

+0

Ho lo stesso problema. Sei riuscito a risolverlo? – grzaks

risposta

1

Ho avuto lo stesso problema con l'interfaccia Javascript-to-Java (WebView.addJavascriptInterface).

In Android 2.1 tutto ha funzionato bene ma in Android 2.2 Javascript non è riuscito a chiamare metodi da questa interfaccia. È stato restituito un errore: Uncaught Error: Error calling method on NPObject!

Sembra che su Android 2.2 il WebView abbia problemi con il tipo di dati Boolean restituito dalle funzioni dell'interfaccia.

Modifica:

public Boolean test_func() { return true; } 

... a:

public int test_func() { return 1; } 

... ha risolto il problema.

+1

utilizzando booleano al posto di Boolean funziona anche – NikoRoberts

5

Nella mia esperienza questo problema è causato dalle interfacce Javascript che riportano oggetti che JavaScript non identifica automaticamente.

In Android questo è causato da wrapper come booleano o lungo rispetto alle loro versioni native booleano e lunga.

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

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

Quindi togliere le classi wrapper per i metodi utilizzati da JavaScript, se si vuole evitare NPObject errori.

11

stavo ottenendo questo errore esatto:

Uncaught Error: Error calling method on NPObject!

Risulta Stavo tentando di richiamare una funzione JavascriptInterface da una WebView in questo modo:

AndroidJS.populateField(field);

e sul lato Java , la funzione non ha accettato un parametro:

public void populateField() {}

Semplicemente consentire alla funzione Java di accettare un parametro ha risolto questo errore per me.

esempio public void populateField(String field) {}

questo non può essere, e probabilmente non è, l'unica ragione per cui questo errore potrebbe essere gettato. Questo è semplicemente il modo in cui ho risolto il mio scenario specifico. Spero che questo ti aiuti!:)

0

Questo credo non sia più supportato (sempre errore NPObject del gioco). Si prega di fare riferimento alla risposta in questa discussione Visita open an activity from a CordovaPlugin

5

OK, ho lo stesso problema pure, solo oggi.

Quello che ho fatto è mettendo il codice in UI thread, come codice qui sotto:

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

Questo risolto il mio problema, e spero che possa aiutare un corpo ... :-)

+0

ottima soluzione - grazie RRTX – bkurzius

2

Ecco una torsione Ho trovato su questo problema che potrebbe essere utile per alcune persone che si imbattono in questo problema (e probabilmente spiega errori intermittenti che sembrano sfidare la spiegazione) ...

Se eventuali eccezioni vengono lanciate (e non catturate) nel restituire il codice del gestore prima di consentire l'interfaccia javascript callback per restituire pulito, si propagherà di nuovo come una chiamata fallita e si otterrà anche questo errore - e non avrebbe nulla a che fare con funzioni o parametri mancanti.

Il modo più semplice per trovare questo caso (che si utilizzi o meno nell'implementazione finale) è quello di spingere qualsiasi codice di gestione che si ha sul thread dell'interfaccia utente (la richiamata non sarà sul thread dell'interfaccia utente) - questo consentire al callback di tornare pulito e tutte le successive eccezioni che si verificano si propagheranno correttamente fino a quando non vengono catturate o finché l'app non si arresta in modo anomalo. In entrambi i casi vedrai esattamente cosa sta realmente accadendo. Altrimenti l'eccezione non rilevata passa a javascript dove non verrà gestita o segnalata in alcun modo (a meno che non si sia specificamente creato il codice di intercettazione degli errori nel JS che si stava eseguendo).

Buona fortuna tutto.

bh

+0

ok, sembra ottimo ma come possiamo farlo esattamente? come possiamo spingere il codice del gestore sul thread ui? –

Problemi correlati