使用 GTK+ Webkit Webview(和 Qt WebKit 桥)从 JavaScript/HTML 调用 C++

Posted

技术标签:

【中文标题】使用 GTK+ Webkit Webview(和 Qt WebKit 桥)从 JavaScript/HTML 调用 C++【英文标题】:Calling C++ from JavaScript / HTML using GTK+ Webkit Webview (and Qt WebKit bridge) 【发布时间】:2013-05-14 07:23:22 【问题描述】:

我目前正在评估从 html 页面中嵌入的 javascript 代码调用 C++ 函数的不同方法/解决方案。该应用程序必须在 Ubuntu Server 12.04 LTS 上运行。

我不是基于 Linux 的开发方面的专家。这是我第一次尝试在 JavaScript 和 C++ 代码之间进行接口。

C++ 代码基本上位于 .so 文件(动态库)中,这些文件将提供接口方法来访问某些硬件和文件系统。 GUI 需要采用 HTML 格式,我正在寻找可以从 HTML 调用 C++ 的不同解决方案。我搜索并最终决定尝试两种方法,均使用 WebKit 引擎。

方法 1:使用 Qt 5.0.2 Webkit Bridge - WebView 控件 GUI 框架将基于 Qt 框架,主应用程序窗口将包含一个 webview 控件,该控件将运行 HTML 代码,而 HTML 代码又包含 JavaScript 代码。 网页和 C++ 之间的接口是使用 addToJavaScriptWindowObject() 函数完成的。

我创建了一个示例应用程序并测试了这个解决方案,它似乎工作正常。

方法二:使用 GTK+ WebKit WebView 我下载并安装了 GTK 3.0 库。 我得到了 webkitgtk 2.0.1 并安装了它。 我用 GTK 创建了一个没有 webkit 的测试应用程序,它运行良好。 我正在尝试使用 GTK 创建一个 webkit webview 控件。

在使用 Qt 尝试我的方法 1 时,有相当多的文档和示例可以做我想做的事情。但是在开始使用 GTK+ 的方法 2 之后,我觉得相对而言移动速度较慢。我个人觉得文档部分对于我正在尝试开发的应用程序来说并不是那么直接。

其他方法: 我还想尝试检查使用 Applets(直接调用 .so 文件)或使用 V8 JavaScript 引擎在 JavaScript 和 C++ 之间进行接口是否可行(https://code.google.com/p/v8/)

我试过以下资源:http://webkitgtk.org/http://www.webkit.org/https://live.gnome.org/WebKitGtk/ProgrammingGuide/Tutorial

我想知道当在包含 JavaScript 的 HTML 网页中单击按钮时,如何准确地执行调用 C++ 函数(在 .so 文件中)的接口部分。我应该寻找什么样的信号。如果我使用的是 WebkitWebview 控件,如何将按钮单击映射到 c++ 函数?

有人能指出正确的方向吗?

非常感谢您的时间和知识。

问候。

【问题讨论】:

如果你使用的是chrome,你可以使用Native Client ***.com/questions/1666957/… 【参考方案1】:

Webkit GTK 2 在 API 方面发生了显着变化。所以我不确定这是否适用于 Webkit GTK 2。但这肯定适用于 Webkit GTK 1.* 版本。对QT一无所知。

如果您需要将 html 视图与 C/C++ 世界连接起来,您可以使用两种方法。请看一下函数 webkit_dom_event_target_add_event_listener。 https://live.gnome.org/WebKitGtk/ProgrammingGuide/Cookbook有例子

您可以采取的另一种方法是在单击按钮时使用警报并发送字符串作为信息。在 C 端,您可以连接警报侦听器并解析消息并决定需要做什么。我已经在 python 中编写了很多采用这种方法的代码,因为上面提到的调用没有暴露给 python。

我同意 webkit gtk 的文档有点稀疏。但是,如果您知道如何在 javascript 中完成某些事情,通常您可以将 javascript DOM 管理和事件调用映射到 C 端。这包括动态生成元素、管理 onclick 等事件。您只需挖掘头文件并找到匹配的调用。

【讨论】:

感谢您的回复。您提到的第一种方法似乎很有趣。我想尝试一下,看看效果如何。至于第二种方法,我需要花一些时间来看看如何实现这一点。但再次感谢您的回答。 :-) 如果您的方法有效,我会将其标记为答案。【参考方案2】:

如果您需要在 Web 应用程序中使用 C++ 代码或本机应用程序,您可以尝试通过 C++ 代码创建服务并通过 REST(例如)API 访问它。

您可以使用通用的 Web 应用程序框架(Spring/Java、Django/Python 等)来开发您的 Web 应用程序并使用 Apache Thrift 来连接您的库。

【讨论】:

感谢您的回复。我确实读过关于 Thrift 的文章,并且尽可能多地使用它,因为它依赖于 Boost,所以我无法这样做。但我确实喜欢这种方法。【参考方案3】:

最适合您的解决方案是 g-xml,它是 GAMA 的一个很好的解决方案,但很抱歉它不是免费的。

【讨论】:

是什么使它成为最佳解决方案?哪些事实可以让您做出这样的声明? 好吧,如果你掌握标签语言这个解决方案是一个带有 g-xml 的 IDE,你可以很容易地构建你的想法,没有任何 html 代码,但结果代码是 html + css + javascript,但你只在 g-xml 中编写,它看起来像 wpf 中的 xaml; 付费解决方案从来都不是最好的。

以上是关于使用 GTK+ Webkit Webview(和 Qt WebKit 桥)从 JavaScript/HTML 调用 C++的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OSX 上安装 python-gtk2、python-webkit 和 python-jswebkit

带有gtk/webkit/jswebkit的呈现/交互式javascript

如何使用 WebView 启用 WebKit 的 Android 应用程序的远程调试/检查器?

Webview/Webkit 未按预期工作

安卓webview是啥东西

error inflating class android.webkit.webview怎样解决