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

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

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

  1. emscripten - 要求将所有源代码编译成位码, 我没有。并且它对可以成功解析的 c++ 代码也有限制。
  2. SWIG - 有一些非平凡的已知问题。 例如,不支持 long long,不支持 Javascript 回调 支持(这个我不明白,这是否意味着js 调用c/c++ lib的代码不能使用回调函数?)
  3. Node gyp - 看来你必须熟悉 V8 源代码和 其他几个库,然后才能完成。
  4. 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 对话。
  • SWIG 确实支持long long。几年前我在一个 Python/C++ 项目中使用过它。如果您编写类型映射,它可以随时支持,但我相信也有原生支持。在您的情况下,回调是指调用 JS 代码的 c++ 代码。
  • 上下文是什么?除了 Node,JavaScript 还意味着浏览器。在浏览器中使用 .dll 是零意义的。由于您不熟悉 Node,这意味着您没有使用它。那么为什么是 JavaScript?
  • @Adam 我添加了一些信息。关于为什么使用 js,似乎使用 GUI 开发任何应用程序的趋势,无论是否是 Web 应用程序,都是 html5+css+js

标签: javascript c++ node.js swig emscripten


【解决方案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”控件。我想这是目前最好/最简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
相关资源
最近更新 更多