JSObject - передаются ли массивы JavaScript как массивы Java? - PullRequest
1 голос
/ 26 октября 2011

Я пытаюсь преобразовать сложный Java-апплет в JavaScript. Апплет совершает все виды магии при общении через TCP-сокет, который мне нужно будет эмулировать в JavaScript. Волшебство TCP само по себе довольно сложное, поэтому я бы предпочел сделать это позже и сначала заставить работать графическую часть апплета. Связь через сокет TCP сообщает апплету, что рисовать, поэтому в зависимости от данных в сокете апплет будет считывать / записывать разные значения.

Мой текущий план атаки:

  • Передать заголовок запроса в JavaScript в качестве параметров (рабочий), а также необходимые данные из сокета в зависимости от типа запроса
  • Разобрать параметры / данные заголовка, отправленные в JS, и соответственно создать объекты
  • Возвращаемое значение для вызова функции Java с массивом байтов, которые должны быть записаны в сокет TCP

Я застрял в последней части. Если я верну массив байтов, как я могу преобразовать его в байт [] или аналогичный? Является ли значение, переданное обратно, правильным массивом Java или это какой-то хэш объекта?

Java:

void callJavaScript(Applet app) {
    String[] params = {"blah", "cool"};

    JSObject win = JSObject.getWindow(app);
    Object ret = win.call("someFunction", params);

    // what is ret?
}

JavaScript:

function someFunction (blah, cool) {
    return [5, 7, 12, 2];
}

Примечание:

Сложный Java-апплет является многопоточным, поэтому просто вызвать некоторую функцию в апплете нетривиально.

1 Ответ

2 голосов
/ 27 октября 2011

Только что написал образец для проверки =)

Test.java:

import java.applet.Applet;
import java.awt.*;
import netscape.javascript.JSObject;

public class Test extends Applet {
  public void init() {
    JSObject window = JSObject.getWindow(this); // this=applet
    String[] params = {"blah", "cool"};
    Object ret = window.call("testfunc", params);
    if (ret instanceof JSObject){
      JSObject jsret = (JSObject)ret;
      Object len = jsret.getMember("length");
      String val = "";
      if (len instanceof Number){
        val = "array: ";
        int n = ((Number)len).intValue();
        for (int i = 0; i < n; ++i){
            val += jsret.getSlot(i).toString() + " ";
        }
      } else{
        val = "no array: " + ret.toString();
      }
      String[] params2 = {val};
      window.call("alert", params2);
    } else{
      String[] params2 = {ret.toString()};
      window.call("alert", params2);
    }
  }
}

test.html:

<html>
  <head>
    <title> Test </title>
      <script language="JavaScript">
        function testfunc(a, b){
          return [1, 2];
        }
      </script>
    </head>
    <body>
      <applet code="Test.class" archive="." width="500" height="200"><param name="codebase_lookup" value="false"></applet>
    </body>
</html>

Преобразования показывают, что docstore.mik.ua / orelly / web / jscript / ch19_06.html работает (рисунки 19.5 и 19.6) Вы можете видеть в моем коде, что я проверил len instanceof Number, а не len instanceof Double, потому что в моем IE он вернул Integer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...