javascript - 如何将 char* 数组传递给 emscripten 编译代码?

标签 javascript c++ arrays emscripten

我正在尝试将 char* 数组传递给 Emscripten 编译函数,但还没有想出如何正确地完成它。

到目前为止我发现的所有示例( herehere )都是关于传递数字数组的,但是不能直接应用于 char* 数组。 Emscripten docs提到 typed array 必须是 Unit8ArrayInt8Array

the third is an array of parameter types...“array” (for a JavaScript array or typed array that corresponds to a C array; for typed arrays, it must be a Uint8Array or Int8Array)...

这是否意味着我们需要将字符串数组转换为这两种格式中的任何一种,然后在 C++ 端将其还原?还有,JS 数组和类型化数组有什么区别?我认为数字数组不需要这种显式转换。

JS代码:

var myFunc = Module.cwrap('myFunc', 'number', ['string', 'array', 'number']);
var strArr = ['abc', 'def', 'ghi', 'jkl'];
var rst = myFunc('abc', strArr, 0);

C++代码:

int myFunc(char* str, char** strArr, int i) {
  std::cout << "[C++] The i is " << i << std::endl; // 0
  std::cout << "[C++] The str is " << str << std::endl; // abc
  std::cout << "[C++] The strArr[i] is " << strArr[i] << std::endl; // not 'abc' ??
  return strcmp(str, strArr[i]);
}

最佳答案

我们可以将 strArr 转换为 char** JavaScript 端。但是如果你修改c++代码,Embind会更好。

var myFunc = Module.cwrap('myFunc', 'number', ['string', 'number', 'number']);

Runtime.stackSave();
var strArr = ['abc', 'def', 'ghi', 'jkl'];
var ptrArr = Runtime.stackAlloc(strArr.length * 4);
for (var i = 0; i < strArr.length; i++) {
    var len = strArr[i].length + 1;
    var ptr = Runtime.stackAlloc(len);
    stringToUTF8(strArr[i], ptr, len);
    Module.setValue(ptrArr + i * 4, ptr, "i32");
}
var rst = myFunc('abc', ptrArr, 1);
Runtime.stackRestore();

关于javascript - 如何将 char* 数组传递给 emscripten 编译代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46943653/

相关文章:

javascript - 没有最高和最低数字js的总和数组

javascript - 在自动完成中显示 "No Results Found"

c++ - 任务管理器是 Windows 10 的一种特殊类型的 'Always on Top' 窗口吗?

c++ - 如何删除正在运行程序的 Win32 桌面,并终止这些程序?

c++ - 保护程序中的 C++ 代码

arrays - 如何在Verilog中将二维数组中的所有位设置为0?

php - 如何在nodejs中将数组值存储在不同的列中

javascript - 执行一系列 Javascript promise ,一个接一个解决

javascript - 如何从两个不同长度的数组javascript创建对象数组

javascript - 用原型(prototype)扩展基本实例?