JavaScript扩展:在Web应用程序中使用基于C的API(clutter)

12

我的目标是使用C库构建Web应用程序。

我选择使用"SWIG"工具来实现这一目标。 Swig工具需要三个东西:

  1. 定义所有函数的.c文件。

  2. 也称为接口文件的.i文件,它创建了接口以加载API,其中我使用了extern关键字。

  3. 用Javascript扩展(.js文件)编写的APP。

我使用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: file:///filename.js: ReferenceError: Can't find variable: example

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;
}

filename.i

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

filename.js

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

如何实现我的目标?
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 文件);作为参考,在 SWIG 中注册包装 C 函数的初始化函数如下所示:register wrapped C functions
int example_init(JSContextRef context) {
  JSObjectRef global = JSContextGetGlobalObject(context);
 ...
  jsc_registerFunction(context, global,  "gcd", _wrap_gcd);
 ...
}

注意--SWIG目前还不正式支持JavaScript;上述是指使用正在进行的(非生产)SWIG分支。
参考文献:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接