2010-07-27 67 views
11

我在我的Android應用程序中使用addJavascriptInterface來允許JavaScript調用我在本地Java應用程序中創建的函數。在NPObject上調用方法時出錯!在Android 2.2

這在Android 2.1中運行良好,但是在Android 2.2中,我收到錯誤消息「ErrorObject on NPObject!」

當我測試方法調用本地方法的內部正在調用,但是異常正在拋出JavaScript。

+0

我遇到同樣的問題。你有沒有設法解決它? – grzaks 2011-07-25 09:37:46

回答

1

我有同樣的問題與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; } 

...解決了這個問題。

+1

使用布爾代替布爾也可以工作 – NikoRoberts 2011-10-10 13:06:03

5

在我的經驗中,這個問題是由Javascript接口帶回的JavaScript不會自動識別的對象造成的。

在Android中,這是通過包裝像布爾比較引起他們的母語版本布爾。如果你想避免NPObject錯誤

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

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

所以刪除您的包裝類的任何方法正在使用的JavaScript。

11

我得到這個確切的錯誤:

Uncaught Error: Error calling method on NPObject!

原來我試圖從網頁視圖調用JavascriptInterface功能,像這樣:

AndroidJS.populateField(field);

,並在Java端,該功能不接受參數:

public void populateField() {}

只是允許Java函數接受參數爲我解決了這個錯誤。

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

這或許不是,大概不是,這個錯誤可能會被拋出的唯一原因。這就是我解決我的具體情況的方法。希望這可以幫助!:)

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

這解決了我的問題,並希望它可以幫助一些身體... :-)

+0

偉大的解決方案 - 謝謝RRTX – bkurzius 2013-06-22 14:45:10

2

這裏是一個扭曲我發現在這個問題上,對於一些遇到這個問題的人可能是有用的(並且它可能解釋了似乎無法解釋的間歇性故障)...

如果在該問題中引發(而未捕獲)在允許javascript接口之前返回處理程序代碼回調返回乾淨,它會作爲一個失敗的調用傳播回來,你也會得到這個錯誤 - 並且它與失蹤函數或參數無關。

找到這種情況的最簡單方法(無論您是否在最終實現中使用此方法)是將您已返回到UI線程的任何處理程序代碼(回調將不在UI線程中) - 這會允許回調返回乾淨,任何後續出現的異常都會正確傳播,直到您捕獲它們或直到應用程序崩潰。無論哪種方式,你會看到究竟發生了什麼。否則,未捕獲的異常將返回到JavaScript,它將不會以任何方式處理或報告(除非您專門將錯誤捕獲代碼構建到您正在執行的JS中)。

好運所有。

bh

+0

好吧,聽起來不錯,但我們究竟能做到這一點?我們如何才能在UI線程上推送處理程序代碼? – 2013-10-31 09:17:28

相關問題