在 web 应用程序中使用基于 C 的 API(混乱)的 Javascript 扩展
Posted
技术标签:
【中文标题】在 web 应用程序中使用基于 C 的 API(混乱)的 Javascript 扩展【英文标题】:Javascript extension to use C based APIs(clutter) in a webapp 【发布时间】:2012-12-03 10:56:14 【问题描述】:我的目标是使用 C 库来构建网络应用程序。
我选择了使用“SWIG”工具来实现这一点。 Swig 工具需要三样东西:
.c
定义所有函数的文件。
.i
文件也称为接口文件,它正在创建
加载 API 的接口,其中我使用了 extern
关键字。
用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);
如何实现我的目标?
【问题讨论】:
【参考方案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 分支。
参考资料:
SWIG-V8 source 及其Javascript documentation swig-jsc source 及其注册绑定的example SWIG JavaScriptCore GSoC 项目source(Google Summer of Code 2012) Webkit:扩展 JavaScript 文章--tutorial/example code【讨论】:
以上是关于在 web 应用程序中使用基于 C 的 API(混乱)的 Javascript 扩展的主要内容,如果未能解决你的问题,请参考以下文章
用于使用 Azure SQL Server 数据的 C# Web API
使用 IdentityServer4 对 Web API 进行基于角色的授权
在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
C# Web API 基于 GET 请求的 XML 或 JSON