如何将 c/c++ 库与 Javascript 一起使用?
How to use c/c++ library with Javascript?
我有第三方的 SDK。我没有源代码,只有头文件、dll 和 lib 文件。此 SDK 提供 C API 以通过 USB 与设备通信。我想在 Javascript 中使用这个 SDK。
我搜索过这个主题,有几种方法。然而,根据我的理解,他们每个人都有一些难点可以很容易地应用到我的情况:
- emscripten - 要求将所有源代码编译成位码,
我没有。并且它对可以成功解析的c++代码也有限制。
- SWIG - 有一些已知的重要问题。
例如,不支持 long long,不支持 Javascript 回调
支持(我不明白这个,这是不是意味着js
调用 c/c++ 库的代码不能使用回调函数?)
- Node gyp - 看来你必须熟悉 V8 源码和
在你完成它之前还有几个其他的库。
- WebIDL - 不太清楚它是关于什么的,需要付出多少努力
需要让它工作,如果可能的话。
欢迎任何thoughts/suggestions!
编辑 1:上下文是我想将该数据从设备获取到浏览器或独立的 node-webkit 应用程序中。类似于在浏览器中获取地理位置信息的用例。
总的来说,我不认为我的问题(将 C++ 组件与 JS 结合使用)是一个奇怪的想法。例如,Mozilla 用 C++ 开发了许多 XPCOM 组件,然后用 XPConnect 包装,以便这些组件可以被 Javascript 在 Firefox 或 XUL 项目中使用。但这种方法非常耗费人力,并且对 Mozilla 的工具链有过多的依赖。 Node js 看起来是一个很有前途的选择。 Node-webkit 本质上与 XUL 做同样的事情:帮助 building/running 一个基于浏览器的跨平台 GUI 应用程序。
使用正确的工具完成工作。
无论如何,您的应用程序只会 Windows,因此请为此使用大量工具。
如果您想在 HTML/JavaScript 中构建 GUI,您仍然可以。只需让您的应用程序成为您在其中编写 GUI 的 HTML 元素的包装器。这样 GUI 就是 HTML,但应用程序的其余部分可以本地与您的 .dll 对话。这会给您和您的用户带来良好的体验。
如果你将浏览器带入其中,除了痛苦你什么也得不到。所有浏览器都在积极努力,让你想要的成为不可能。加载本机代码对浏览器制造商来说意味着安全性、稳定性和兼容性问题。
唯一的其他干净方法是将您的应用程序编写为一种 SaaS 应用程序。即分为两部分,一个服务器组件编写为本地 Windows 应用程序,它加载 .dll 并提供一个 HTTP 服务器来为您的 HTML+JS GUI 组件提供服务。这种方法是否有意义取决于您的应用程序的作用。如果期望它全部在一台机器上使用,那么这会给您的用户增加不必要的痛苦。如果将 .dll 加载到一台机器上然后在另一台计算机或移动应用程序上远程访问它是有意义的,那么它可能是有意义的。一些以这种方式工作的应用程序包括 SABnzbd、Plex 媒体服务器、Transmission 具有这种模式、任何在 NAS 上 运行 等
我有第三方的 SDK。我没有源代码,只有头文件、dll 和 lib 文件。此 SDK 提供 C API 以通过 USB 与设备通信。我想在 Javascript 中使用这个 SDK。
我搜索过这个主题,有几种方法。然而,根据我的理解,他们每个人都有一些难点可以很容易地应用到我的情况:
- emscripten - 要求将所有源代码编译成位码, 我没有。并且它对可以成功解析的c++代码也有限制。
- SWIG - 有一些已知的重要问题。 例如,不支持 long long,不支持 Javascript 回调 支持(我不明白这个,这是不是意味着js 调用 c/c++ 库的代码不能使用回调函数?)
- Node gyp - 看来你必须熟悉 V8 源码和 在你完成它之前还有几个其他的库。
- WebIDL - 不太清楚它是关于什么的,需要付出多少努力 需要让它工作,如果可能的话。
欢迎任何thoughts/suggestions!
编辑 1:上下文是我想将该数据从设备获取到浏览器或独立的 node-webkit 应用程序中。类似于在浏览器中获取地理位置信息的用例。 总的来说,我不认为我的问题(将 C++ 组件与 JS 结合使用)是一个奇怪的想法。例如,Mozilla 用 C++ 开发了许多 XPCOM 组件,然后用 XPConnect 包装,以便这些组件可以被 Javascript 在 Firefox 或 XUL 项目中使用。但这种方法非常耗费人力,并且对 Mozilla 的工具链有过多的依赖。 Node js 看起来是一个很有前途的选择。 Node-webkit 本质上与 XUL 做同样的事情:帮助 building/running 一个基于浏览器的跨平台 GUI 应用程序。
使用正确的工具完成工作。
无论如何,您的应用程序只会 Windows,因此请为此使用大量工具。
如果您想在 HTML/JavaScript 中构建 GUI,您仍然可以。只需让您的应用程序成为您在其中编写 GUI 的 HTML 元素的包装器。这样 GUI 就是 HTML,但应用程序的其余部分可以本地与您的 .dll 对话。这会给您和您的用户带来良好的体验。
如果你将浏览器带入其中,除了痛苦你什么也得不到。所有浏览器都在积极努力,让你想要的成为不可能。加载本机代码对浏览器制造商来说意味着安全性、稳定性和兼容性问题。
唯一的其他干净方法是将您的应用程序编写为一种 SaaS 应用程序。即分为两部分,一个服务器组件编写为本地 Windows 应用程序,它加载 .dll 并提供一个 HTTP 服务器来为您的 HTML+JS GUI 组件提供服务。这种方法是否有意义取决于您的应用程序的作用。如果期望它全部在一台机器上使用,那么这会给您的用户增加不必要的痛苦。如果将 .dll 加载到一台机器上然后在另一台计算机或移动应用程序上远程访问它是有意义的,那么它可能是有意义的。一些以这种方式工作的应用程序包括 SABnzbd、Plex 媒体服务器、Transmission 具有这种模式、任何在 NAS 上 运行 等