【问题标题】:Javascript extension to use C based APIs(clutter) in a webapp在 web 应用程序中使用基于 C 的 API(混乱)的 Javascript 扩展
【发布时间】:2012-12-03 10:56:14
【问题描述】:

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

我选择了使用“SWIG”工具来实现这一点。 Swig 工具需要三样东西:

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

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

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

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

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

现在我想在浏览器页面上运行这个应用

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

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

错误信息:JS CONSOLE: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);

如何实现我的目标?

【问题讨论】:

    标签: javascript webkit dom-events swig clutter


    【解决方案1】:

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

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

    调整这个example 的钩子到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);供参考的是 register wrapped C functions 的初始化函数在 SWIG 中的样子:

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

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

    参考资料:

    【讨论】:

      猜你喜欢
      • 2020-06-29
      • 1970-01-01
      • 2019-05-19
      • 2013-04-24
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多