首页 > 解决方案 > 将数组传递给 V8 函数

问题描述

我已经开始为我的 C++ 项目考虑 V8,我很难理解数据是如何从 C++ 应用程序传递到 V8 引擎并返回的。

下面是一些伪代码,我希望能够定义一个doPocess在 JS 中调用的全局函数,该函数进行一些处理,只能由 C++ 应用程序读回:

function doProcess(input, output){
    for (var i in input){
        var byte = input[i]
        output.push(byte)
    }
}

为了传递数据数组并捕获输出结果,C++ 代码会是什么样子?

标签: c++bufferv8

解决方案


您不能直接将 C++ 数组(例如 an int[])公开给 JavaScript。相反,您有(至少)以下选项:

(1) 您可以分配一个 JavaScript 数组(参见v8.hArray中的类),复制数据(根据需要将每个元素转换为 JS 值),然后将该数组作为参数传递给您的 JavaScript 函数。由于复制,这将使数组创建有些昂贵。

(2) 可以定义一个带有索引拦截器和“嵌入器字段”的对象,将C++数组存储在嵌入器字段中,并根据需要使用索引拦截器检索元素。由于拦截器,这将使数组元素的访问成本有些高。

(3) 对于纯数字数据,您可以使用 TypedArray,它使您可以选择在 C++ 和 JavaScript 之间共享后备存储。

您可以通过从全局对象中读取(按名称)来获取 JavaScript 函数本身。对于输出,应用相同的选项(在 (1) 的相反方向复制)。

请务必查看文档和官方示例


推荐阅读