2010-07-27 17 views
11

Estoy usando addJavascriptInterface dentro de mi aplicación Android para permitir que JavaScript invoque funciones que he creado en mi aplicación Java nativa.Método de llamada de error en NPObject! en Android 2.2

Esto funcionó bien en Android 2.1, sin embargo, en Android 2.2 recibí el mensaje de error "Método de llamada de error en NPObject!"

Cuando instrumenta el método, se llama a las partes internas del método nativo, sin embargo, la excepción es lanzar en JavaScript.

+0

Estoy teniendo el mismo problema. ¿Has logrado resolverlo? – grzaks

Respuesta

1

Tuve el mismo problema con la interfaz Javascript-to-Java (WebView.addJavascriptInterface).

En Android 2.1 todo funcionó bien, pero en Android 2.2 JavaScript no pudo llamar a los métodos desde esta interfaz. Devolvió un error: Uncaught Error: Error calling method on NPObject!

Parece que en Android 2.2, WebView tiene un problema con el tipo de datos booleanos devueltos por las funciones de la interfaz.

cambiante:

public Boolean test_func() { return true; } 

... a:

public int test_func() { return 1; } 

... resuelto el problema.

+1

usando boolean en lugar de Boolean también funciona – NikoRoberts

5

En mi experiencia, este problema es causado por las interfaces de Javascript que devuelven objetos que Javascript no identifica automáticamente.

En este androide es causado por las envolturas como booleana o largo en comparación con sus versiones nativas booleano y largo.

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

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

Así retire sus clases contenedoras a cualquiera de los métodos utilizados por JavaScript si desea evitar errores NPObject.

11

que estaba recibiendo este error exacto:

Uncaught Error: Error calling method on NPObject!

Resulta que yo estaba tratando de invocar una función JavascriptInterface de una vista web de esta manera:

AndroidJS.populateField(field);

y en el lado de Java , la función no aceptó un parámetro:

public void populateField() {}

Simplemente permitiendo que la función de Java acepte un parámetro solucionó este error por mí.

por ejemplo, public void populateField(String field) {}

Esto no puede ser, y probablemente no es la única razón de este error podría ser lanzado. Así es como resolví mi situación específica. ¡Espero que esto ayude!:)

5

Bien, tengo el mismo problema también, solo en el día de hoy.

Lo que hizo es poner el código en hilo de interfaz de usuario, como el código de abajo:

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

Esto resolvió mi problema, y ​​espero que pueda ayudar a algún cuerpo ... :-)

+0

gran solución - gracias RRTX – bkurzius

2

Aquí un giro Encontré en este problema que podría ser útil para algunas personas que se enfrentan con este problema (y probablemente explique fallas intermitentes que parecen desafiar la explicación) ...

Si se lanzan (y no atrapan) excepciones en el devolver el código del controlador antes de permitir la interfaz de JavaScript devolución de llamada para devolver limpio, se propagará de nuevo como una llamada fallida y también obtendrá este error, y no tendría nada que ver con funciones o parámetros faltantes.

La forma más fácil de encontrar este caso (ya sea que use esto en su implementación final) es insertar cualquier código de controlador que tenga en el hilo de la interfaz de usuario (la devolución de llamada no estará en el hilo de la interfaz de usuario). Permita que la devolución de llamada vuelva a estar limpia y cualquier excepción posterior que ocurra se propagará adecuadamente hasta que la capture o hasta que la aplicación falle. De cualquier manera, verá exactamente lo que está sucediendo realmente. De lo contrario, la excepción no detectada vuelve a javascript, donde no se manejará ni informará de ninguna manera (a menos que haya creado específicamente un código de captura de errores en el JS que estaba ejecutando).

Buena suerte Todo.

bh

+0

bien, suena genial, pero ¿cómo podemos hacer eso exactamente? ¿Cómo podemos presionar el código del controlador en el hilo de la interfaz de usuario? –

Cuestiones relacionadas