如何在 Javascript 中使用 c/c++ 库?

Posted

技术标签:

【中文标题】如何在 Javascript 中使用 c/c++ 库?【英文标题】:How to use c/c++ library with Javascript? 【发布时间】:2015-09-17 03:49:38 【问题描述】:

我有一个来自第三方的 SDK。我没有源代码,只有头文件、dll 和 lib 文件。此 SDK 提供 C API 以通过 USB 与设备进行通信。我想在 javascript 中使用这个 SDK。

我已经搜索过这个主题并且有几种方法。但是,根据我的理解,它们中的每一个都有一些困难可以很容易地应用于我的情况:

    emscripten - 要求将所有源代码编译成位码, 我没有。并且它对可以成功解析的 c++ 代码也有限制。 SWIG - 有一些非平凡的已知问题。 例如,不支持 long long,不支持 Javascript 回调 支持(这个我不明白,这是否意味着js 调用c/c++ lib的代码不能使用回调函数?) Node gyp - 看来你必须熟悉 V8 源代码和 其他几个库,然后才能完成。 WebIDL - 不太清楚它的用途,付出了多少努力 如果可能的话,需要让它发挥作用。

欢迎提出任何想法/建议!

编辑 1:上下文是我想将设备中的数据获取到浏览器或独立的 node-webkit 应用程序中。类似于在浏览器中获取地理位置信息的用例。 一般来说,我不认为我的问题(使用带有 JS 的 C++ 组件)是一个奇怪的想法。例如,Mozilla 用 C++ 开发了许多 XPCOM 组件,然后用 XPConnect 包装,以便这些组件可以被 Firefox 中的 Javascript 或 XUL 项目使用。但是这种方法非常耗费人力,并且对 Mozilla 的工具链产生了过多的依赖。 Node js 看起来是一个很有前途的替代方案。 Node-webkit 本质上与 XUL 做同样的事情:帮助构建/运行基于浏览器的跨平台 GUI 应用程序。

【问题讨论】:

可能更容易将其保留为 C++ 并使用 IPC/redis/0mq/etc 与 JS 对话。 github.com/node-ffi/node-ffi怎么样 SWIG 确实支持long long。几年前我在一个 Python/C++ 项目中使用过它。如果您编写类型映射,它可以随时支持,但我相信也有原生支持。在您的情况下,回调是指调用 JS 代码的 c++ 代码。 上下文是什么?除了 Node,JavaScript 还意味着浏览器。在浏览器中使用 .dll 是零意义的。由于您不熟悉 Node,这意味着您没有使用它。那么为什么是 JavaScript? @Adam 我添加了一些信息。关于为什么使用 js,似乎使用 GUI 开发任何应用程序的趋势,无论是否是 Web 应用程序,都是 html5+css+js 【参考方案1】:

为工作使用正确的工具。

无论如何,您的应用都只能是 Windows,因此请使用大量的工具。

如果您想用 HTML/JavaScript 构建 GUI,您仍然可以。只需让您的应用程序成为您编写 GUI 的 HTML 元素的包装器。这样,GUI 就是 HTML,但应用程序的其余部分可以原生地与您​​的 .dll 对话。这将为您和您的用户带来良好的体验。

如果您将浏览器带入其中,您只会感到痛苦。所有浏览器都在积极努力使您想要的成为不可能。加载原生代码对浏览器制造商来说只是安全性、稳定性和兼容性问题。

唯一另一种干净的方法是将您的应用程序编写为一种 SaaS 应用程序。即分为两部分,一个作为原生 Windows 应用程序编写的服务器组件,它加载 .dll 并提供一个 HTTP 服务器来为您的 HTML+JS GUI 组件提供服务。这种方法是否有意义取决于您的应用程序的功能。如果预计它会在一台机器上全部使用,那么这会给您的用户带来不必要的痛苦。如果将 .dll 加载到一台机器上然后远程访问它是有意义的,无论是在另一台计算机或移动应用程序上,那么它可能是有意义的。一些以这种方式工作的应用程序包括 SABnzbd、Plex 媒体服务器、Transmission 具有这种模式、任何打算在 NAS 上运行的东西等等。

【讨论】:

我没有明确表达我的意图。假设设备是 GUI 需要响应的输入设备。在 GUI(html+js) 和设备之间,一些代码需要处理数据(通过 C API)并将事件冒泡到 GUI 进行处理(在 js 中)。本质上,我说的是编写一个 GUI 工具包。我看到的最大问题是第 3 方库是作为二进制而不是源代码提供的(对于其他平台,Linux、android 等)。 SaaS 方法看起来类似于 IPC thru socket。您能解释一下如何让应用成为 HTML 元素的包装器吗? 我明白这是你的意图。 SaaS 方法肯定是 IPC,虽然是基于 HTTP 的套接字。我们倾向于称之为“浏览网页”。 所有 GUI 工具包都支持嵌入 HTML 引擎。在 .Net 中,我相信这是 IE 的引擎。基本上,您可以让您的应用程序的窗口有一个单独的子窗口,即 HTML 窗格。然后您可以在 HTML 中完成 UI 的其余部分。具体操作方法取决于您选择的语言和工具集。 我明白你的意思。大多数框架(甚至 wxWidgets)都为此提供了“webview”控件。我想这是目前最好/最简单的方法。

以上是关于如何在 Javascript 中使用 c/c++ 库?的主要内容,如果未能解决你的问题,请参考以下文章

优雅的创建一个JavaScript库

如何将javascript代码编译为c++或java

在javascript中组合2个数组

如何生成和解析json格式数据

在vs2019中double如何使用?

牛客网在线判题系统JavaScript(V8)使用