2

私は、Javascriptを使用してコーディングしようとしているWebP時代のJavaアプレットを持っています。

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]);
}

オブジェクトを含む行にブレークポイントを付加し、 firebugfor()でオブジェクトを検査すると、のtoString()devicesは[Ljava.lang.String;@1d0b3465です。配列が返されるので、これは理にかなっていると思いtoString()ます。単純な値を表示するのは適切ではありません。

フロアループを見るとdevices.length、表示されている値は、public netscape.javascript.JSException(java.lang.String, java.lang.String, int, java.lang.String, int)

私はJavaを呼び出すJavascriptの使い方を数え切れないほど読んでいますが、かなりシームレスな相互運用のように見えるものでどこが間違っているのかわかりません。

ある時点ではOSX上のFirefoxで動作していたと言えますが、キャッシュされたアプレットを保持しているため、問題が何であるか混乱しています。ワークステーションとラップトップの両方でキャッシュを削除しようとしましたが、まだ古いjarファイルにしがみついているようです。これがどれだけ私に影響を与えているのかわかりません。

getSourceDeviceNames私のアプレットが文字列または文字列の配列を返しても、違いはないようです。検査時に同じエラーが表示されます。キャッシュがそれに影響を与えているかどうかはわかりません。

4

2 に答える 2

1

http://www.uow.edu.au/~hasan/buss930/jscript/packages.htm#1014128によると、 「Java配列は、array.lengthとarray[index]を理解するJavaScriptオブジェクトでラップされています。」これはSunJavaで正常に動作しますが、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側の配列から要素を抽出するためのhawを見つけることができませんでした。検索を続行できますが、アプレットのコードを変更できる場合はgetSourceDeviceName(int index)、デバイス#iの名前getNumberOfSourceDeviceNames()を返し、配列の長さを返すメソッドを公開する方がおそらく良い方法です。

ライブコネクトを使用する場合、プリミティブの操作は他のタイプの操作よりも常に簡単で移植性が高くなります。

于 2012-05-15T13:23:02.543 に答える