如何将 char* 数组传递给 emscripten 编译的代码
How to pass char* array to emscripten compiled code?
我正在尝试将char*
数组传递给Emscripten编译的函数,但还没有弄清楚如何正确执行此操作。
到目前为止,我找到的所有示例(这里和这里)都是关于传递数字数组的,但是不能直接应用于char*
数组。Emscripten 文档提到类型化数组必须Unit8Array
或Int8Array
。
第三个是参数类型的数组..."array"(用于对应于 JavaScript 数组或类型化数组 一个 C 数组;对于类型化数组,它必须是 Uint8Array 或 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();
相关文章:
- 为什么 emscripten 不编译我的函数?
- Javascript 找不到使用 emscripten 编译的导出 WASM 函数
- 没有 Emscripten,如何使用标准库编译C++到 WebAssembly
- 我可以在不使用Qt for Webassembly的情况下使用Emscripten编译Qt吗?
- 在 Windows 上使用 Emscripten 和 CMake 编译 GLFM 的问题
- Emscripten 和 boost 库:如何为 WebAssembly 编译现有项目
- 如何指示emscripten在编译过程中应在哪里找到源文件
- 使用 Emscripten 将 OpenCV 代码编译C++ Javascript
- 从使用 emscripten 编译的 c++ 连接 websocket 时出现问题
- Emscripten 链接静态库错误:wasm 流式编译失败:导入'env.getTempRet0'
- 链接到由Emscripten编译的Box2D链接时的未定义符号
- 如何将 char* 数组传递给 emscripten 编译的代码
- 在使用 emscripten 编译时,我该怎么做才能包含 <X11/Xlocale.h>?
- 使用 Emscripten 编译 C++ ImpulseEngine 到 JavaScript
- 编译双重比较函数'IsAlmostEqual'时出现 Emscripten 错误
- 是否可以像现在一样轻松地编译Emscripten,但不需要控制台和Emscripten徽标
- 使用 Emscripten 编译 GLUT
- 使用emscripten编译结构时出错
- Emscripten 将C++编译为 JavaScript 和 Asm 的不良结果.js
- 如何修复包含emscripten标头时的编译错误