如何处理传递/返回数组指针到 emscripten 编译的代码?

阅读时长 4 分钟读完

在使用 emscripten 编译 C/C++ 代码成为 WebAssembly 模块时,经常需要传递和返回指针。但是,由于 JavaScript 和 C/C++ 语言的内存管理方式不同,因此在处理指针时会遇到一些挑战。

本文将介绍如何正确地传递和返回数组指针到 emscripten 编译的代码中,并提供示例代码以帮助读者更好地理解。

传递数组指针

假设我们有一个 C 函数 sum,它接受一个 int 数组指针和数组长度作为参数,并返回数组元素之和。我们想要在 JavaScript 中调用这个函数,可以使用以下代码:

-- -------------------- ---- -------
----- --- - ------------------- --------- ---------- ----------

----- --- - --- -- -- -- ---
----- ------ - -----------

-- ------------- - --
----- ------ - ----------- -----

-------------------- -- -- --

上述代码中,Module.cwrap 函数用于获取 sum 函数的 JavaScript 接口,并定义了其返回值类型为 number,参数类型为 numberarray。然后,我们创建一个包含整数值的数组 arr,并将其长度存储在 length 变量中。最后,我们将 lengtharr 传递给 sum 函数,并将返回值存储在 result 变量中。

在 C 或 C++ 中,我们可以使用以下代码来处理传入的数组指针:

在上述代码中,我们简单地遍历了整个数组,并将每个元素相加以计算结果。

返回数组指针

现在,假设我们有一个 C 函数 reverse,它接受一个 int 数组指针和数组长度作为参数,并返回一个新的数组,其中包含反转后的元素。我们想要在 JavaScript 中调用这个函数,并获取其返回的数组指针。

首先,我们需要在 C/C++ 中分配内存以存储新的数组。在 emscripten 中,我们可以使用 malloc 函数来完成此操作。然后,在将指针返回给 JavaScript 之前,我们需要将数据复制到 emscripten 堆上。最后,我们将数组指针作为整数值返回给 JavaScript。

下面是实现这个功能的示例代码:

C/C++ 代码:

-- -------------------- ---- -------
---- ----------- ----- --- ------- -
  -- -------------
  --- ------------ - ------ ------------- - -------------

  -- --------------
  --- ---- - - -- - - ------- ---- -
    -------------- - ---------- - - - ---
  -

  -- -----------
  ------ ------------
-

JavaScript 代码:

-- -------------------- ---- -------
----- ------- - ----------------------- --------- ---------- ----------

----- --- - --- -- -- -- ---
----- ------ - -----------

-- ------------- - --
----- ------------------ - --------------- -----

-- --------- ---------- --
----- ----------- - --- -------------------------------- ------------------- --------

------------------------- -- -- --- -- -- -- --

在上述代码中,我们使用 Module.HEAP32 对象将指针转换为 JavaScript 数组。这是因为 emscripten 在默认情

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/31343

纠错
反馈