Подтвердить что ты не робот

Расширение javascript для использования API на основе C (беспорядок) в webapp

Моя цель - использовать библиотеки C для создания веб-приложений.

Я выбрал способ сделать это с помощью инструмента "SWIG". Инструмент Swig требует трех вещей

1) .c file which defines all the functions.

2) .i file also called interface file which is creating the
interface to load the APIs wherin I used the extern keyword.

3) APP written in javascript extension (.js file).

Я использовал инструмент SWIG для компиляции и запуска этого приложения, чтобы проверить корректность файла .js. Приложение отлично работает в окне XMING X11.

В компиляции создается _wrap.o,.o файл и libFILENAME.so

Теперь я хочу запустить это приложение на странице браузера.

Для этого я использовал порт webkit clutter, который дает нам код MxLauncher. Я использую webkit_iweb_view_load_uri (WEBKIT_IWEB_VIEW (view), "filename.html" ); API для загрузки моего html файла для запуска этого javascript на моем веб-странице.

Я связываю .so, созданный во время компиляции.

Сообщение об ошибке: JS CONSOLE: файл:///filename.js: ReferenceError: не удается найти переменную: пример

filename.c

int gcd(int x, int y) `enter code here`{
  int g;
  g = y;
  while (x > 0) {
    g = x;
    x = y % x;
    y = g;
  }
  return g;
}

имя_файла .i

%module example
extern int    gcd(int x, int y);

filename.js

x = 42;
y = 105;
g = example.gcd(x,y);

Как добиться моей цели?

4b9b3361

Ответ 1

Вам также нужно сообщить WebKit/JavaScriptCore во время выполнения о ваших привязках (это в дополнение к ссылке с filename_wrap.o).

В частности, вам необходимо привязать их к глобальному объекту JavaScript (чтобы вызвать на ваш пример .js). Обратный вызов в окне WebKit можно использовать для своевременной ссылки на глобальный контекст JavaScript, а затем вы можете зарегистрировать свои функции на нем.

Применяя этот пример подключения к сигналу window-object-cleared, код может выглядеть примерно так:

/* the window callback - 
     fired when the JavaScript window object has been cleared */
static void window_object_cleared_cb(WebKitWebView  *web_view,
                                     WebKitWebFrame *frame,
                                     gpointer        context,
                                     gpointer        window_object,
                                     gpointer        user_data)
{
  /* Add your classes to JavaScriptCore */
  example_init(context); // example_init generated by SWIG
}


/* ... and in your main application set up */
void yourmainfunc()
{
    ....

    g_signal_connect (G_OBJECT (web_view), "window-object-cleared",
        G_CALLBACK(window_object_cleared_cb), web_view);

    webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), "file://filename.html");

    ...
}

В зависимости от того, какая ветвь SWIG вы используете, вам может понадобиться генерировать функцию example_init самостоятельно (проверьте filename.cxx); для справки вот что означает функция инициализации зарегистрировать завернутые функции C, как в SWIG:

int example_init(JSContextRef context) {
  JSObjectRef global = JSContextGetGlobalObject(context);
 ...
  jsc_registerFunction(context, global,  "gcd", _wrap_gcd);
 ...
}

ПРИМЕЧАНИЕ. - SWIG еще не официально поддерживает JavaScript; выше относится к использованию незавершенных (непроизводственных) ветвей SWIG.

Литература: