gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:12:05 24 4
gpt4 key购买 nike

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

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

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

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

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

我使用 SWIG 工具编译并运行此应用程序以验证 .js 文件是否正确生成。该应用程序在 XMING X11 窗口上运行良好。

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

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

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

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

Error Message: 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);

如何实现我的目标?

最佳答案

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

具体来说,您需要将它们绑定(bind)到全局 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 分支。

引用资料:

关于在 Web 应用程序中使用基于 C 的 API(困惑)的 Javascript 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13681780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com