2012-05-15 36 views
2

我有一個Java小程序上的WebP齡期,我試圖用Javascript代碼。從Java Applet調用方法與JavaScript返回[Ljava.lang.String; @ 7ac79dfa

public class WebCapture extends Applet { 

    public String[] getSourceDeviceNames() { 
    return new String[] {'Device 1', 'Device 2'}; 
    } 

    public void acquireImage() { 
    //... 
    } 

} 

我編譯這個小程序和支持庫到一個jar文件,它包含在我的HTML頁面,如下所示:

<embed id="webCaptureApplet" 
code="com.brian.webcapture.applets.WebCapture" 
archive="jar/WebCapture.jar" 
type="application/x-java-applet"> 

    <noembed> 
     Oops! It looks like Java is not installed. =[ 
    </noembed> 

</embed> 

這似乎是有效的,我看到呈現一個空白的Java小程序屏幕和,如果我打電話

document.getElementById('webCaptureApplet');

我可以alert()物體並接收響應[object HTMLEmbedElement]

太好了。現在,當我嘗試執行下面的代碼:當我附上一個斷點到含有for()

var applet = document.getElementById('webCaptureApplet'); 
var devices = applet.getSourceDeviceNames(); 

for(var i = 0; i < devices.length; i++) { 
    alert(devices[i]); 
} 

並檢查與螢火蟲對象,的devicestoString()值爲[Ljava.lang.String; @ 1d0b3465 。我認爲這是有道理的,因爲數組正在傳回,並且它不是友好的,因爲它顯示了一個簡單的值。

當我看到在福爾環devices.length,顯示的值是一個public netscape.javascript.JSException(java.lang.String, java.lang.String, int, java.lang.String, int)

的方法存根我看過無數的如何是於JavaScript調用Java,我不能看到我已經錯了什麼似乎是非常無縫的互操作。

我應該說在某一時刻它通過OS X上的Firefox工作,但它堅持一個緩存的小程序,所以我很困惑問題在那裏。我嘗試刪除我的工作站和筆記本電腦上的緩存,但他們似乎仍然堅持使用舊罐。我不知道這對我有多影響。

這似乎是,如果我的小程序的getSourceDeviceNames返回一個字符串或字符串數​​組沒有什麼差別。它在檢查時仍會顯示相同的錯誤。我不確定緩存是否有影響。

回答

1

根據http://www.uow.edu.au/~hasan/buss930/jscript/packages.htm#1014128 「Java數組包裝在一個理解array.length和array [index]的JavaScript對象中。」 與Sun Java一起工作良好,但在OpenJDK上運行時返回JSException。

我能找到的唯一方法是計算數組的元素。

var length = 0; 
while(array[length]) 
    length++; 

看來,這個功能在OpenJDK中是有問題的。

0

你在這裏與數組混淆。當你從JavaScript調用java代碼時,簡單類型自然映射,而其他類型可能會導致一些問題。例如,數組映射到JavaArray(http://www.nusphere.com/kb/jscoreguide/lc.html)。

我爲你做了一個簡短的搜索,並沒有設法找到haw從javascript數組中提取元素。歡迎您繼續搜索,但如果您可以修改applet的代碼,可能更好的方法是公開方法getSourceDeviceName(int index),將返回設備#i的名稱和getNumberOfSourceDeviceNames()返回數組長度的名稱。

處理實時連接時,使用原語總是比其他類型更簡單,更便於攜帶。

+0

謝謝,我感謝您提供的鏈接中的資源。我明白你對原始類型的看法,並且我可能無法以我的代碼示例中表示的方式通過索引來訪問JavaArray。 但是,該代碼塊沒有被達到。我仍然接受表面支持的程序問題。 (長度是JavaArray的只讀屬性)。這在實例化上失敗,並且沒有與該對象一起工作。 – Brian