我在我的 Android 应用程序中使用 addJavascriptInterface 来允许 JavaScript 调用我在本机 Java 应用程序中创建的函数。
这在 Android 2.1 中运行良好,但是在 Android 2.2 中我收到错误消息“错误调用 NPObject 的方法!”
当我检测方法调用时,本地方法的内部被调用,但是异常在 JavaScript 中被抛出。
我在我的 Android 应用程序中使用 addJavascriptInterface 来允许 JavaScript 调用我在本机 Java 应用程序中创建的函数。
这在 Android 2.1 中运行良好,但是在 Android 2.2 中我收到错误消息“错误调用 NPObject 的方法!”
当我检测方法调用时,本地方法的内部被调用,但是异常在 JavaScript 中被抛出。
我得到了这个确切的错误:
Uncaught Error: Error calling method on NPObject!
原来我试图从 webview 调用 JavascriptInterface 函数,如下所示:
AndroidJS.populateField(field);
在 Java 方面,该函数不接受参数:
public void populateField() {}
简单地允许 Java 函数接受一个参数就为我解决了这个错误。
例如,
public void populateField(String field) {}
这可能不是,也可能不是引发此错误的唯一原因。这就是我解决特定场景的方式。希望这可以帮助!:)
好的,我也有同样的问题,就在今天。
我所做的是将代码放入 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;
}
这解决了我的问题,希望它可以帮助一些身体...... :-)
根据我的经验,这个问题是由 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 使用的任何方法。
这是我在这个问题上发现的一个转折点,可能对遇到这个问题的一些人有用(它可能解释了似乎无法解释的间歇性故障)......
如果在允许 javascript 接口回调返回 clean 之前在返回处理程序代码中抛出(并且未捕获)任何异常,它将作为失败的调用传播回来,您也会收到此错误 - 它与缺少函数或参数。
找到这种情况的最简单方法(无论您是否在最终实现中使用它)是将您拥有的任何处理程序代码推回 UI 线程(回调不会在 UI 线程上) - 这将允许回调return clean 并且随后发生的任何异常都将正确传播,直到您捕获它们或直到应用程序崩溃。无论哪种方式,您都会确切地看到正在发生的事情。否则,未捕获的异常会传回 javascript,不会以任何方式处理或报告(除非您专门将错误捕获代码构建到您正在执行的 JS 中)。
祝大家好运。
bh
我对 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; }
...解决了这个问题。
我相信不再支持这一点(总是游戏 NPObject 错误)。请参阅此线程中的答案访问从 CordovaPlugin 中打开活动