我在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)
返回一个字符串或一个字符串数组,它似乎没有什么区别。它在检查时仍会显示相同的错误。我不确定缓存是否会影响它。
答案 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()
。
在使用实时连接时,使用基元比使用其他类型更容易,更便携。