12

私の目標は、C ライブラリを使用して Web アプリを作成することです。

「SWIG」ツールを使用してそれを行う方法を選択しました。Swig ツールには次の 3 つのものが必要です。

  1. .cすべての関数を定義するファイル。

  2. .iexternこのファイルは、キーワードを使用した API をロードするためのインターフェイスを作成するインターフェイス ファイルとも呼ばれます。

  3. .jsJavascript 拡張子 (ファイル)で記述された APP 。

SWIG ツールを使用してこのアプリをコンパイルおよび実行し、.jsファイルが正しく作成されていることを確認しました。アプリケーションは XMING X11 ウィンドウで正常に動作しています。

コンパイル時に_wrap.o.oファイルとlibFILENAME.so.

今、ブラウザページでこのアプリを実行したいと思います。

このために、MxLauncher コードを提供する webkit clutter ポートを使用しました。APIを使用webkit_iweb_view_load_uri(WEBKIT_IWEB_VIEW(view), "filename.html");してhtmlファイルをロードし、WebページビューでそのJavascriptを実行しています。

.soコンパイル時に作成したものをリンクしています。

エラーメッセージ: JS CONSOLE: file:///filename.js: ReferenceError: Can't find variable: example

ファイル名.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);

ファイル名.js

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

私の目標を達成するにはどうすればよいですか?

4

1 に答える 1

2

また、実行時にバインディングについて 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 ブランチの使用を指します。

参考文献:

于 2013-04-01T23:50:22.603 に答える