我在Android应用程序中使用addJavascriptInterface,允许JavaScript调用我在本机Java应用程序中创建的函数。
这在Android 2.1中运行良好,但是在Android 2.2中我收到错误消息“错误调用NPObject上的方法!”
当我对方法调用进行检测时,会调用本机方法的内部,但异常是在JavaScript中抛出。
答案 0 :(得分:11)
我收到了这个确切的错误:
Uncaught Error: Error calling method on NPObject!
原来我试图从webview中调用JavascriptInterface函数,如下所示:
AndroidJS.populateField(field);
在Java方面,该函数不接受参数:
public void populateField() {}
简单地允许Java函数接受参数为我解决了这个错误。
如,
public void populateField(String field) {}
这可能不是,也可能不是,这个错误可能被抛出的唯一原因。这就是我如何解决我的具体情况。希望这可以帮助! :)
答案 1 :(得分:5)
根据我的经验,这个问题是由Javascript接口带回Javascript无法自动识别的对象引起的。
在Android中,与其本机版本布尔和长相比,这是由布尔或长等包装引起的>
//This will fail
public Long getmyLongVal() {
return 123456789;
}
//This will work
public long getMyNativeLongVal() {
return 123456789;
}
因此,如果要避免NPObject错误,请将您的包装类移除到Javascript使用的任何方法。
答案 2 :(得分:5)
好的,我也有同样的问题,就在今天。
我所做的是将代码放在UI线程中,如下面的代码:
/**
* 給網頁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;
}
这解决了我的问题,并希望它可以帮助一些身体...: - )
答案 3 :(得分:2)
这是我在这个问题上发现的一个转折,对于遇到这个问题的一些人来说可能是有用的(并且它可能解释了似乎无法解释的间歇性失败)......
如果在允许javascript接口回调返回clean之前在返回处理程序代码中抛出(并且没有捕获)任何异常,它将作为失败的调用传播回来,你也会得到这个错误 - 它什么都没有与缺少的功能或参数有关。
找到这种情况的最简单方法(无论你是否在最终实现中使用它)是将你所拥有的任何处理程序代码推送到UI线程(回调将不在UI线程上) - 这将允许返回clean以及发生的任何后续异常的回调将正常传播,直到您捕获它们或直到应用程序崩溃为止。无论哪种方式,你都会看到到底发生了什么。否则,未捕获的异常会传回javascript,不会以任何方式处理或报告(除非您专门在正在执行的JS中构建了错误捕获代码)。
祝你好运。BH
答案 4 :(得分:1)
我遇到了与Javascript-to-Java界面(WebView.addJavascriptInterface
)相同的问题。
在Android 2.1中一切正常但在Android 2.2中Javascript无法从此界面调用方法。它返回了一个错误:Uncaught Error: Error calling method on NPObject!
似乎在Android 2.2上,WebView存在从接口函数返回的布尔数据类型的问题。
更改:
public Boolean test_func() { return true; }
......来:
public int test_func() { return 1; }
...解决了这个问题。
答案 5 :(得分:0)
我相信这已经不再支持了(总是游戏NPObject错误)。 请参阅此主题中的答案 访问open an activity from a CordovaPlugin