2

我在 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 小程序呈现在屏幕上,如果我调用

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()值为devices[Ljava.lang.String;@1d0b3465。我认为这是有道理的,因为数组正在被传回,并且toString()对于显示简单的值并不友好。

当我devices.length在 foo 循环中查看时,显示的值是 a 的方法存根public netscape.javascript.JSException(java.lang.String, java.lang.String, int, java.lang.String, int)

我已经阅读了无数关于 Javascript 调用 Java 的操作方法,但我看不出我在似乎非常无缝的互操作方面出了什么问题。

我应该说它曾在 OS X 上通过 Firefox 运行,但它保留了一个缓存的小程序,所以我很困惑问题出在哪里。我曾尝试删除工作站和笔记本电脑上的缓存,但它们似乎仍然粘在旧罐子上。我不确定这对我有多大影响。

getSourceDeviceNames如果我的小程序返回一个字符串或一个字符串数组,这似乎没有什么区别。它仍然会在检查时显示相同的错误。我不确定缓存是否会影响这一点。

4

2 回答 2

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 中是有缺陷的。

于 2012-07-05T10:51:16.767 回答
0

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

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

使用实时连接时,使用原语总是比使用其他类型更容易且更便携。

于 2012-05-15T13:23:02.543 回答