在NPObject上调用方法时出错!在Android 2.2中

时间:2010-07-27 13:44:23

标签: android android-webview

我在Android应用程序中使用addJavascriptInterface,允许JavaScript调用我在本机Java应用程序中创建的函数。

这在Android 2.1中运行良好,但是在Android 2.2中我收到错误消息“错误调用NPObject上的方法!”

当我对方法调用进行检测时,会调用本机方法的内部,但异常是在JavaScript中抛出。

6 个答案:

答案 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