我在我的Android應用程序中使用addJavascriptInterface來允許JavaScript調用我在本地Java應用程序中創建的函數。在NPObject上調用方法時出錯!在Android 2.2
這在Android 2.1中運行良好,但是在Android 2.2中,我收到錯誤消息「ErrorObject on NPObject!」
當我測試方法調用本地方法的內部正在調用,但是異常正在拋出JavaScript。
我在我的Android應用程序中使用addJavascriptInterface來允許JavaScript調用我在本地Java應用程序中創建的函數。在NPObject上調用方法時出錯!在Android 2.2
這在Android 2.1中運行良好,但是在Android 2.2中,我收到錯誤消息「ErrorObject on NPObject!」
當我測試方法調用本地方法的內部正在調用,但是異常正在拋出JavaScript。
我有同樣的問題與JavaScript到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; }
...解決了這個問題。
使用布爾代替布爾也可以工作 – NikoRoberts 2011-10-10 13:06:03
在我的經驗中,這個問題是由Javascript接口帶回的JavaScript不會自動識別的對象造成的。
在Android中,這是通過包裝像布爾或龍比較引起他們的母語版本布爾和長。如果你想避免NPObject錯誤
//This will fail
public Long getmyLongVal() {
return 123456789;
}
//This will work
public long getMyNativeLongVal() {
return 123456789;
}
所以刪除您的包裝類的任何方法正在使用的JavaScript。
我得到這個確切的錯誤:
Uncaught Error: Error calling method on NPObject!
原來我試圖從網頁視圖調用JavascriptInterface功能,像這樣:
AndroidJS.populateField(field);
,並在Java端,該功能不接受參數:
public void populateField() {}
只是允許Java函數接受參數爲我解決了這個錯誤。
例如, public void populateField(String field) {}
這或許不是,大概不是,這個錯誤可能會被拋出的唯一原因。這就是我解決我的具體情況的方法。希望這可以幫助!:)
這我相信不再支持了(總是遊戲NPObject錯誤)。 請參閱此線程中的答案 訪問open an activity from a CordovaPlugin
好的,我也有同樣的問題,就在今天。
我所做的是把代碼在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;
}
這解決了我的問題,並希望它可以幫助一些身體... :-)
偉大的解決方案 - 謝謝RRTX – bkurzius 2013-06-22 14:45:10
這裏是一個扭曲我發現在這個問題上,對於一些遇到這個問題的人可能是有用的(並且它可能解釋了似乎無法解釋的間歇性故障)...
如果在該問題中引發(而未捕獲)在允許javascript接口之前返回處理程序代碼回調返回乾淨,它會作爲一個失敗的調用傳播回來,你也會得到這個錯誤 - 並且它與失蹤函數或參數無關。
找到這種情況的最簡單方法(無論您是否在最終實現中使用此方法)是將您已返回到UI線程的任何處理程序代碼(回調將不在UI線程中) - 這會允許回調返回乾淨,任何後續出現的異常都會正確傳播,直到您捕獲它們或直到應用程序崩潰。無論哪種方式,你會看到究竟發生了什麼。否則,未捕獲的異常將返回到JavaScript,它將不會以任何方式處理或報告(除非您專門將錯誤捕獲代碼構建到您正在執行的JS中)。
好運所有。
bh
好吧,聽起來不錯,但我們究竟能做到這一點?我們如何才能在UI線程上推送處理程序代碼? – 2013-10-31 09:17:28
我遇到同樣的問題。你有沒有設法解決它? – grzaks 2011-07-25 09:37:46