簡體   English   中英

來自Java Applet的調用方法,其中Javascript返回[Ljava.lang.String; @ 7ac79dfa

[英]Calling method from Java Applet with Javascript returning [Ljava.lang.String;@7ac79dfa

我有一個Webp時代的Java小程序,我試圖用Javascript進行編程。

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 applet,如果我調用

document.getElementById('webCaptureApplet');

我可以alert()對象並收到響應[object HTMLEmbedElement]

大。 現在,當我嘗試執行以下代碼時:

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

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

當我附上一個斷點到包含線for()並檢查與螢火蟲上述目的, toString()的值devices是[Ljava.lang.String; @ 1d0b3465。 我認為這是有道理的,因為將數組傳回,並且toString()不友好,無法顯示簡單的值。

當我在foor循環中查看devices.length時,顯示的值是public netscape.javascript.JSException(java.lang.String, java.lang.String, int, java.lang.String, int)的方法存根。

我已經讀了無數關於如何調用Java的Java腳本的方法,但我看不出似乎無縫互操作的地方出了問題。

我應該說,它曾經在OS X上通過Firefox運行,但是它一直保留在緩存的applet上,所以我很困惑問題所在。 我試圖刪除我的工作站和筆記本電腦上的緩存,但它們似乎仍然緊貼舊的瓶子。 我不確定這對我有多大影響。

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

根據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中有問題。

您對這里的數組感到困惑。 當您從javascript調用Java代碼時,簡單類型會自然映射,而其他類型可能會引起一些問題。 例如,數組映射到JavaArray (http://www.nusphere.com/kb/jscoreguide/lc.html)。

我為您進行了簡短的搜索,但沒有找到如何從JavaScript端從數組中提取元素的方法。 歡迎您繼續搜索,但如果可以修改applet的代碼,可能更好的方法是公開方法getSourceDeviceName(int index) ,該方法將返回然后返回設備#i的名稱和getNumberOfSourceDeviceNames()來返回數組長度。

與實時連接相比,使用原語總是比其他類型更容易且更可移植。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM