11

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

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

当我检测方法调用时,本地方法的内部被调用,但是异常在 JavaScript 中被抛出。

4

6 回答 6

11

我得到了这个确切的错误:

Uncaught Error: Error calling method on NPObject!

原来我试图从 webview 调用 JavascriptInterface 函数,如下所示:

AndroidJS.populateField(field);

在 Java 方面,该函数不接受参数:

public void populateField() {}

简单地允许 Java 函数接受一个参数就为我解决了这个错误。

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

这可能不是,也可能不是引发此错误的唯一原因。这就是我解决特定场景的方式。希望这可以帮助!:)

于 2012-05-18T16:30:08.813 回答
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;
}

这解决了我的问题,希望它可以帮助一些身体...... :-)

于 2013-05-23T07:22:00.900 回答
5

根据我的经验,这个问题是由 Javascript 接口带回 Javascript 无法自动识别的对象引起的。

在 Android 中,这是由BooleanLong等包装器与其原生版本booleanlong相比引起的。

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

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

因此,如果您想避免 NPObject 错误,请将您的包装类删除到 Javascript 使用的任何方法。

于 2012-01-03T20:33:03.973 回答
2

这是我在这个问题上发现的一个转折点,可能对遇到这个问题的一些人有用(它可能解释了似乎无法解释的间歇性故障)......

如果在允许 javascript 接口回调返回 clean 之前在返回处理程序代码中抛出(并且未捕获)任何异常,它将作为失败的调用传播回来,您也会收到此错误 - 它与缺少函数或参数。

找到这种情况的最简单方法(无论您是否在最终实现中使用它)是将您拥有的任何处理程序代码推回 UI 线程(回调不会在 UI 线程上) - 这将允许回调return clean 并且随后发生的任何异常都将正确传播,直到您捕获它们或直到应用程序崩溃。无论哪种方式,您都会确切地看到正在发生的事情。否则,未捕获的异常会传回 javascript,不会以任何方式处理或报告(除非您专门将错误捕获代码构建到您正在执行的 JS 中)。

祝大家好运。

bh

于 2013-05-30T14:35:42.053 回答
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; }

...解决了这个问题。

于 2011-07-25T09:52:38.843 回答
0

我相信不再支持这一点(总是游戏 NPObject 错误)。请参阅此线程中的答案访问从 CordovaPlugin 中打开活动

于 2013-05-08T21:30:16.393 回答