【问题标题】:I need to call c++ function from javascript. Is it possible or not?我需要从 javascript 调用 c++ 函数。有没有可能?
【发布时间】:2015-05-07 12:32:47
【问题描述】:

有 c++ 库,我需要从客户端浏览器上运行的 JavaScript 对该库进行函数调用,该库仅驻留在客户端计算机中。如何加载库并访问 c++ 库提供的接口(函数)?该库主要包含算法和渲染调用。

【问题讨论】:

  • 不,不可能。
  • 可能来自支持本机的扩展,否则不会。
  • 简答:通常。这取决于浏览器内置的 javascript 引擎。每个人都有自己的做事方式(查阅开发者文档)。
  • 这听起来像是一场即将发生的安全灾难。
  • 如果 Chrome-only 没问题,看看 PNaCl

标签: javascript c++ web


【解决方案1】:

我能想到的几个选项:

1) 在 JavaScript 中查找不同的库。

2) 将 C++ 代码移植到 JavaScript。这有多容易取决于 C++ 代码有多复杂,或者你需要多少。

3) 将 C++ 代码包装在服务器上的 Web 服务中,并使用 AJAX 调用它。我个人不熟悉任何 C++ Web 服务框架,但除此之外,您可以为库创建 JavaPython.NET 绑定(或仅用于您需要的部分),或在另一种语言。然后,您可以用您选择的任何语言编写您的 Web 服务。

3B) #3 的替代方案 - 如果库具有命令行界面,或者存在使用该库的命令行程序,您的 Web 服务可以调用它,而您不必编写语言捆绑。但请注意,使用此选项需要注意性能和安全问题。

4) 如果您有库的 C++ 源代码,您可以尝试使用 Emscripten 将库编译为 JavaScript。

我可能会大致按这个顺序尝试。我可能会尝试 #3 最后因为它可能是最棘手的。

此外,如果您执行 #3 或 #3B,您需要确保您对库的使用是线程安全的。

免责声明:除了#3B,我从未尝试过任何这些。

【讨论】:

    【解决方案2】:

    您最好为 C++ 库创建一个“C”包装器并从 Javascript 中调用它。

    由于语言标准缺乏严格的 ABI 定义,C++ 是出了名的难以交互。 C 没有这个限制。因此,当您希望两种编程语言相互交流时,“C”最终成为通用语。

    【讨论】:

    • 我在这方面有过实际经验。我们选择在 C++ 中设计我们想要的接口,并将它们实现为 C 函数,这些函数接受一个不透明的指针,指向一个定义状态的结构,一个假的 thisself。因此,例如,C++ 中的 Sieve::computePrimes() 映射到 C 中的 csieve_compute_primes(csieve*)。现在您有一个 C 库,您可以从任何易于执行的语言绑定到该库,默认为 C++,Python 使用它的 ctypes 包或 Go 使用它的 cgo 包。当然,还有 JavaScript 和 asm.js。
    • 如果您有兴趣看到这一点,请查看我最近添加到 GitHub 的 project
    【解决方案3】:

    通常浏览器不允许这样做,因为那非常不安全。 您可以在 asm.js 中编译 C++ 并将其用作 JavaScript 库。

    或者,您可以创建浏览器扩展程序,该扩展程序将运行或调用所需的代码。

    【讨论】:

      【解决方案4】:

      是的,但在您可以从 javascript 调用它们之前。为此,您可以创建一个接口文件来告诉 javascript 有关该接口的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2021-06-19
        相关资源
        最近更新 更多