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

11

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

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

当我检测方法调用时,会调用本机方法的内部操作,但异常却在JavaScript中被抛出。


我也遇到了同样的问题。你解决了吗? - grzaks
6个回答

11

我遇到了与此完全相同的错误:

未捕获的错误:在 NPObject 上调用方法时出错!

结果发现我正在尝试从 WebView 调用一个 JavascriptInterface 函数,代码如下:

AndroidJS.populateField(field);

而在 Java 侧,该函数不接受参数:

public void populateField() {}

简单地让 Java 函数接受一个参数即可解决此错误。

例如: public void populateField(String field) {}

这可能不是唯一导致此错误的原因,也很可能不是。但这是我解决特定情况的方式。希望这可以帮助你! :)


6

好的,我也遇到了同样的问题,就是在今天。

我所做的是将代码放在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;
}

这解决了我的问题,希望能对一些人有所帮助... :-)

5
在我个人的经验中,这个问题是由于JavaScript接口返回了JavaScript无法自动识别的对象所导致的。
在Android中,这是由包装器(例如Boolean或Long)引起的,与它们的本机版本boolean和long相比。
//This will fail
public Long getmyLongVal() {
    return 123456789;
}

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

如果你想避免NPObject错误,那么请将任何被JavaScript使用的方法中的包装类删除。


2
这是我在这个问题上发现的一个变通方法,对于一些遇到这个问题的人可能会有用(它很可能解释了似乎无法解释的间歇性故障)...
如果在允许javascript接口回调返回之前,在返回处理程序代码中抛出任何异常(且未被捕获),它将作为失败的调用传播回来,并且您也会收到此错误消息 - 这与缺少函数或参数没有任何关系。
最简单的找到此情况的方法(无论您是否在最终实现中使用此方法)是将您拥有的任何处理程序代码推回到UI线程上(回调不会在UI线程上),这将允许回调返回干净,并且发生的任何后续异常都将正确地传播,直到您捕获它们或应用程序崩溃。无论哪种方式,您都将看到实际发生的情况。否则,未捕获的异常将传回javascript,其中它将不会以任何方式处理或报告(除非您在执行的JS中专门构建了错误捕获代码)。
祝大家好运。
bh

好的,听起来很不错,但我们要如何做到呢?我们如何将处理程序代码推送到 UI 线程上? - Radu Simionescu

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; }

...问题已解决。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接