javascript - EM_JS : How to convert int argc, char **argv 到 JS 字符串数组?

标签 javascript c++ c webassembly emscripten

我正在尝试使用字符串数组作为参数从 C/C++ 调用 JS 函数。

这是我的示例代码:

ma​​in.c:

#include <stdio.h>
#include <emscripten.h>

EM_JS(void, call_myFunc, (int argc, char **argv), {
     
    var arr = [];
    for (let i = 0; i < argc; i++) {
      arr.push(UTF8ToString(argv[i]));
    }
    myFunc(arr);
});

int main()
{
    int argc = 4;
    char *argv[5] = { "ab", "cd", "ef", "gh" };
    call_myFunc(argc, argv);
}

index.html:

<!DOCTYPE html>
<html>

<head>
</head>

<body>
  <script>
  function myFunc(args) {
    console.log(args);
  }
  </script>
  <script async src="main.js"></script>
</body>

</html>

构建:

emcc main.c -o main.html

我得到的结果:

["", "", "", ""]

我想要的结果:

["ab", "cd", "ef", "gh"]

如何正确地将 char **argv 转换为 JS 字符串数组?

最佳答案

How can I properly convert char **argv to a JS array of strings?

来自 emscripten.h 的文档:

Null-terminated C strings can also be passed into EM_JS functions, but to operate on them, they need to be copied out from the heap to convert to high-level JavaScript strings.

EM_JS(void, say_hello, (const char* str), {
  console.log('hello ' + UTF8ToString(str));
}

In the same manner, pointers to any type (including void *) can be passed inside EM_JS code, where they appear as integers like char * pointers above did. Accessing the data can be managed by reading the heap directly.

EM_JS(void, read_data, (int* data), {
  console.log('Data: ' + HEAP32[data>>2] + ', ' + HEAP32[(data+4)>>2]);
});

int main() {
  int arr[2] = { 30, 45 };
  read_data(arr);
  return 0;
}

因此,您可以将 HEAP32UTF8ToString 一起使用,如下所示:

ma​​in.c

#include <stdio.h>
#include <emscripten.h>

EM_JS(void, call_myFunc, (const int argc, const char** argv), {
    var arr = [];
    for (let i = 0; i < argc; i++) {
        const mem = HEAP32[(argv + (i * 4)) >> 2];
        const str = UTF8ToString(mem);
        arr.push(str);
    }
    console.log(arr);
});

int main() {
    const int argc = 4;
    const char* argv[] = { "ab", "cd", "ef", "gh" };
    call_myFunc(argc, argv);
    return 0;
}

编译:

emcc main.c -o main.html

使用节点运行:

node main.js

输出:

[ 'ab', 'cd', 'ef', 'gh' ]

关于javascript - EM_JS : How to convert int argc, char **argv 到 JS 字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63321398/

相关文章:

javascript - 将 Google 图表转换为图像

c++ - 我似乎无法得到正确的平均值

C - 将函数加载到数据库 - 调用堆栈错误/段错误

c - 在 C 中使用 fread() 分配内存和读取数组的最便携方法

c++ - 双端队列从前面删除元素并将它们放在后面

c - C11原子与序列点的关系

javascript - 如何将 Laravel URL::asset 与 javascript 变量一起使用

javascript - 从 Javascript 调用 DLL 方法

javascript - 函数以 DD/MM/YYYY 格式获取 Javascript 中昨天的日期

c++ - 并发线程比单线程慢