使用 emscripten 将数组传递给 C 函数

Posted

技术标签:

【中文标题】使用 emscripten 将数组传递给 C 函数【英文标题】:Pass array to C function with emscripten 【发布时间】:2016-10-17 09:41:04 【问题描述】:

我认为这个问题与this one 类似,我使用了它的大部分答案来解决我的问题,但我仍然有问题:

首先是C代码:

#include <stdio.h>

extern "C"

    void fillArray(int* a, int len)
    
        for (int i = 0; i<len; i++)
        
            a[i] = i*i;
        

        for (int j = 0; j < len; ++j)
        
            printf("a[%d] = %d\n", j, a[j]);
        
    

我将一个指向数组的指针传递给我的 C 函数并用一些信息填充它。我用

编译这段代码
emcc -o writebmp.js dummyCode\cwrapCall.cxx -s EXPORTED_FUNCTIONS="['_fillArray']"

我的 html/js 代码如下:

<!doctype html>
<html>
  <script src="writebmp.js"></script>
  <script>
    fillArray = Module.cwrap('fillArray', null, ['number', 'number']);
    var nByte = 4
    var length = 20;
    var buffer = Module._malloc(length*nByte);
    fillArray(buffer, length);
    for (var i = 0; i < length; i++)
    
        console.log(Module.getValue(buffer+i*nByte));
    
  </script>
</html>

当我运行脚本时,我得到的输出是正确的,直到第 12 个元素,之后它就是垃圾。是不是我 malloc 的缓冲区太小了?

【问题讨论】:

【参考方案1】:

Module.getValue 接受一个可选的第二个参数,表示“指针”应该被取消引用的类型,默认情况下这是'i8',这意味着 32 位有符号整数被取消引用为 8 位整数,所以你'不会得到垃圾,而是绕过错误。

解决这个问题很简单,您只需指定传递给Module.getValue 的“指针”应取消引用为 32 位有符号整数:

console.log(Module.getValue(buffer+i*nByte, 'i32'));

fillArray的声明改为

#include <stdint.h>

void fillArray(int32_t* a, int32_t len)

emscripten 文档的相关部分可以找到here

【讨论】:

以上是关于使用 emscripten 将数组传递给 C 函数的主要内容,如果未能解决你的问题,请参考以下文章

您是不是必须释放传递给 Emscripten 中导出的 C 函数的字符串?

使用 emscripten 将字符串从 C++ 传递给 JS

将 JS 数字数组传递给 emscripten C++ 而无需 reinterpret_cast

将 C/C++ 套接字传递给 EM_ASM 以在 Emscripten 中用作 websocket

将文件名传递给 Emscripten 生成的 js 作为参数

Emscripten malloc 和跨 JS 和 C++ 的免费