Как реализовать API javascript с помощью JSNI?

Я пытаюсь реализовать API (SCORM API) с помощью GWT. Клиентский код ожидает объект API с такими методами, как Initialize(), getLastError() и т.д....

Я попытался реализовать этот API как объект Java, но вижу, что скомпилированные имена изменены и не могут использоваться непосредственно клиентским кодом.

Я вижу, что gwt-exporter может помочь (http://code.google.com/p/gwt-exporter/), но я хотел бы знать, как это сделать, используя чистый gwt и jsni.

Поскольку API ожидается как объект с именем API_1484_11, прикрепленный к объекту окна, а не как функция, я не понимаю, как использовать идиому $entry().

Вот мой текущий неудачный код:

public final class SCORMApi {

    protected SCORMApi() {}

    public void Initialize(){
        GWT.log("** INITIALIZE CALLED **");
    }

    public static void create(){
        bind(new SCORMApi());
    }

    public static native void bind(SCORMApi api) /*-{
        $wnd.API_1484_11 = api;
    }-*/;

}

Итак, в этом контексте мой вопрос:

Как я могу получить вызовы javascript (например, window.API_1484_11.Initialize() ) для доступа к моему коду java gwt?


person Julio Faerman    schedule 17.01.2013    source источник


Ответы (1)


Вы находитесь на правильном пути со своим методом bind. Но вы не поняли, как вызывать методы Java из JSNI. Вот как вы это делаете в случае вашего метода Initialize:

public static native void bind(SCORMApi api) /*-{
    $wnd.API_1484_11 = {
        initialize: function() {
            $entry( [email protected]::Initialize()() );
        }
    };
}-*/;

Блоги Знакомство с частями GWT 1 и 2 обязательны к прочтению на эту тему.

person funkybro    schedule 17.01.2013
comment
Спасибо, это приятно знать. На самом деле я использую что-то подобное, но пытался не писать API дважды (один раз во встроенном объекте javascript и один раз в java). Но я думаю, что это настолько хорошо, насколько это возможно... - person Julio Faerman; 18.01.2013
comment
В моем коде я не использовал запись $, как это делала часть 1 упомянутой вами статьи (Создание библиотек JavaScript с частью GWT), и, похоже, все работает нормально. Документы довольно расплывчаты в отношении работы $entry, не знаете ли вы, где можно найти больше об этом? - person Julio Faerman; 18.01.2013
comment
Рассмотрите возможность использования GWT Exporter, я широко использую его именно для этой цели. - person funkybro; 18.01.2013