使用Javascript返回来自Java Applet的调用方法[Ljava.lang.String; @ 7ac79dfa

时间:2012-05-15 13:05:57

标签: java javascript applet

我在webp时代有一个Java applet,我试图使用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小程序渲染到屏幕上,如果我调用

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()的行并使用firebug检查对象时,toString()的{​​{1}}值为[Ljava.lang.String; @ 1d0b3465。我认为这是有意义的,因为数组被传回,并且devices对于显示简单的值不友好。

当我在foor循环中查看toString()时,显示的值是devices.length

的方法存根

我已经阅读了无数关于Javascript调用Java的方法,我无法看到我出错的地方似乎是相当无缝的互操作。

我应该说,它曾经在OS X上通过Firefox工作,但它仍然坚持使用缓存的applet,所以我很困惑那里的问题是什么。我已经尝试在我的工作站和笔记本电脑上删除我的缓存,他们似乎仍然坚持旧罐子。我不确定这对我有多大影响。

如果我的applet的public netscape.javascript.JSException(java.lang.String, java.lang.String, int, java.lang.String, int)返回一个字符串或一个字符串数组,它似乎没有什么区别。它在检查时仍会显示相同的错误。我不确定缓存是否会影响它。

2 个答案:

答案 0 :(得分: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中存在错误。

答案 1 :(得分:0)

你在这里与数组混淆。当您从javascript调用java代码时,简单类型会自然映射,而其他类型可能会导致一些问题。例如,数组映射到JavaArray(http://www.nusphere.com/kb/jscoreguide/lc.html)。

我为你做了一个简短的搜索,并没有设法找到haw从javascript端从数组中提取元素。欢迎您继续搜索,但如果您可以修改applet的代码,可能更好的方法是公开方法getSourceDeviceName(int index),然后返回设备#i的名称和返回数组长度的getNumberOfSourceDeviceNames()

在使用实时连接时,使用基元比使用其他类型更容易,更便携。