Javascript 扩展在 Web 应用程序中使用基于 C 的 API(混乱)

2024-03-04

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

我选择了通过使用“SWIG”工具来做到这一点的方法。 Swig 工具需要三件事:

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

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

  3. 用Javascript扩展编写的APP(.js file).

我使用 SWIG 工具编译并运行这个应用程序来验证.js文件已正确制作。 该应用程序在 XMING X11 窗口上运行良好。

编译时它会创建_wrap.o, .o文件和libFILENAME.so.

现在我想运行这个app在浏览器页面上。

为此,我使用了 webkit clutter port,它为我们提供了 MxLauncher 代码。 我在用着webkit_iweb_view_load_uri(WEBKIT_IWEB_VIEW(view), "filename.html");用于加载我的 html 文件以在我的网页视图上运行该 Javascript 的 API。

我正在链接.so在编译时创建。

错误信息: JS 控制台: file:///filename.js: ReferenceError:找不到变量:示例

文件名.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);

如何才能实现我的目标?


您还需要在运行时告诉 WebKit/JavaScriptCore 您的绑定(这是除了与 filename_wrap.o 链接之外的)。

具体来说,您需要将它们绑定到全局 JavaScript 对象(以便根据您的 .js 示例进行调用)。 WebKit 窗口上的回调可用于及时引用全局 JavaScript 上下文,然后您可以将函数注册到其上。

适应这个example https://github.com/vrruiz/WebKit-JavaScriptCore-Extensions/blob/master/webkit-02.c#L87挂钩到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自己运行(检查文件名.cxx);供参考的是初始化函数的作用注册包装的 C 函数 https://github.com/oliver----/swig-v8/blob/devel/Doc/Manual/Javascript.md#wrapper-functions在 SWIG 中看起来像:

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

注意——SWIG 尚未正式支持 JavaScript;上述指的是使用正在进行的(非生产)SWIG 分支。

参考:

  • SWIG-V8 source https://github.com/oliver----/swig-v8和它的JavaScript 文档 https://github.com/oliver----/swig-v8/blob/devel/Doc/Manual/Javascript.md#wrapper-functions
  • swig-jscsource https://github.com/ashishs99/swig-jsc和它的example https://github.com/ashishs99/swig-jsc/blob/a15943ac/Examples/javascript/simple/runme.cxx#L95注册绑定
  • SWIG JavaScriptCore GSoC 项目source https://github.com/Neha03/gsoc2012-javascript(2012 年 Google 编程之夏)
  • Webkit:扩展 JavaScript 文章--tutorial http://rvr.typepad.com/wind/2011/10/webkit-extending-javascript-1.html / 示例代码 https://github.com/vrruiz/WebKit-JavaScriptCore-Extensions
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 扩展在 Web 应用程序中使用基于 C 的 API(混乱) 的相关文章

随机推荐