いつも参考にさせていただいています。
appletからLiveConnect(JSObject)を用いて、JavaScriptの関数をコールしています。
JavaScriptに引数として配列を渡そうとすると、「未定義のエラー」というものが帰ってきました。
エラーが出るソースは以下になります。
JAVA側
String tmp[] = new String[tmpNum];
for (i = 0; i < tmpNum; i++) {
tmp[i] = Integer.toString(i);
}
JSObject win = JSObject.getWindow(this);
win.call("SampleMethod", new Object[]{Integer.toString(tmpNum), tmp});
/* tmpNumはアプレットが呼び出されるたびに値が決定されます(配列の要素数は一意ではありません)*/
JavaScript側
function SampleMethod(num, val) {
var str;
for (i = 0; i < num; i++) {
str = str + String(val[i]) + ", ";//ここでエラーが出力される
}
alert(str);
}
JavaScriptの 「str = str + String(val[i]) + ", ";」 の部分で「未定義のエラー」が表示されます。
valをnew Arrayしていないので表示されるのだと思いますが、どうにかして引数に配列を渡すことはできないでしょうか。
ご教授宜しくお願いいたします。
単純に str を初期化していないとか。
var str="";
ご回答ありがとうございます。
var str=""に関しましては、試してみましたが、やはり同じ結果となりました。
試しにと思いまして、JavaScript側のプログラムにalert(val);を挿入してみたところ、画面に表示されたアラート文は「Ljava.lang.object@…」という文字列になっていました。
どうもJAVAの配列のアドレスが表示されたのでは推測されます。
JSObjectクラスのメソッドcallは引数にobjectクラスの配列を取り、いったんString型に変換しJavaScriptに渡していると思っていましたが、配列をString型に変換する際は、中身ではなく、アドレスが変換されているような気がします。
うーん、どうにかしてわたせないのかな・・・
ミスがありました。
上記のalert(val);の結果ですが、表示されたのは、「[Ljava.lang.String;@11298d」という文でした。
※
大変失礼なことだと重々承知しておりますが、急を要しますので以下のサイトでも投稿させていただきました。申し訳ございません。
結果が分り次第、両方のサイトに結果を反映いたします。宜しくお願い申し上げます。
IT会議室様 Java Solution 会議室
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21278&forum=12&0
この手のオブジェクトを実用で使用したことがないので、
回答と呼べないレスで申し訳ないのですが…
素朴に考えるのは、配列をそのままJavaScriptの配列の引数(しかも第二)に渡せないのでは?
ですが…
まずは、どの程度の段階まで動作してるか確認したいのですが、
シンプルなインターフェイスで動作確認を取られているのですか?
例えば、
try {
String[] args = new String[] { "test" }; // まずは一つ
JSObject win = JSObject.getWindow(this);
win.call("SampleMethod", args);
} catch (JSException except) {
output...
}
function SampleMethod(arg) {
alert(arg); // 受け取れた?
}
※以前テスト使用した時に、いろいろな条件の下に例外が頻発しました。
(古い覚書なので、どんな事でだったかは覚えてないのですが)
次に、一つの引数が受け取れれば、二つ、三つと増やして受け取れますか?
> tmpNumはアプレットが呼び出されるたびに値が決定されます(配列の要素数は一意ではありません)
ここが主点になっていると思います(上の文章は必要なさそうに思えましたが書いてしまいました)。
上記の方法がうまくいけば、JavaScript側の可変変数のargumentsオブジェクトは利用できないんでしょうか?
もし、argumentsが利用できないおよびお急ぎでしたら、
配列をシリアライズ(一つの文字列スカラーに変換)して受け渡しを行うという手はどうでしょうか?
他の詳しい方に、まともな回答をお譲りするということで…
NintendoPSP 様、ご回答ありがとうございます。
引数1つのシンプルなものや、
win.call("SampleMethod", new Object[] {arg1, arg2, arg3, …});
といった、固定数を並べたものが正常に動くのは確認していました。
それから、argumentsオブジェクトを利用する方法でうまく期待通りの動きを行うことができました。
ありがとうございます。
実際に動いたソースですが、以下のようになっています。
■JAVA側
String tmp[] = new String[tmpNum + 1];
tmp[0] = Integer.toString(tmpNum);
for (i = 0; i < tmpNum; i++) {
tmp[i + 1] = Integer.toString(i);
}
JSObject win = JSObject.getWindow(this);
win.call("SampleMethod", tmp);
■JavaScript側
function SampleMethod() {
var str;
num = arguments[0];
for (i = 0; i < num; i++) {
str = str + String(arguments[i + 1]) + ", ";
}
alert(str);
}
配列を渡すという固定概念が、argumentsオブジェクトを使うことを考えさせませんでした・・・お恥ずかしい。
ご回答をくださいました桜様、NintendoPSP様、ならびに目を通してくださいました皆様、どうもありがとうございました。