EM_JS:如何将int argc、char**argv转换为JS字符串数组



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

这是我的示例代码:

main.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数组?

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

来自emscripten.h:的文档

以Null结尾的C字符串也可以传递到EM_JS函数中,但要对它们进行操作,需要将它们从堆中复制出来以转换为高级JavaScript字符串。

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

以同样的方式,指向任何类型(包括void *(的指针都可以在EM_JS代码中传递,在那里它们以整数形式出现,就像上面的char *指针一样。访问数据可以通过直接读取堆来管理。

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

main.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:运行

node main.js

输出:

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

相关内容

  • 没有找到相关文章