提问人:KungPhoo 提问时间:3/7/2023 更新时间:3/10/2023 访问量:192
Emscripten JS 库 - 传递字符串
Emscripten JS library - pass strings
问:
我想在 Emscripten 库中的 C++ 和 JS 之间交换字符串。
我在C++代码中所做的是:
extern "C" {
// pass a string to JS, return a JS string back to C++
const char* CallJavascript(const char* strInput) {
static char outp[2048]; // static buffer for the return value.
strncpy(outp, strInput, 2047); // copy input to the buffer
glb_emscripten_call(pBuffer); // pass buffer and overwrite in JS. See below
return outp; // return contents of changed buffer
}
}
在 JS 文件中,链接到 --js-library:
var LibraryGLB = {
$GLB__deps: ['$Browser'],
$GLB : {
// pass a string pointer (char ** ), read what it passed and overwrite the string with
// the return value.
glb_emscripten_call:function( ioStringPointer )
{
var myString = HowToGetAString(ioStringPointer); // TODO
alert(myString);
var strOut = 'Hello World';
strcpy(strOut, ioStringPointer, 2048); // TODO
},
end_of_struct:0
};
autoAddDeps(LibraryGLB, '$GLB');
mergeInto(LibraryManager.library, LibraryGLB);
所以,我的 2 个问题是:如何将 C 指针地址转换为 JS 字符串,以及如何将 JS 字符串的字节复制到指针中?
我想使用 stringToUTF8() 并尝试添加 ,但我收到一个 SyntaxError“不能在模块外部使用 import 语句”。很奇怪。import Module from './myapp.js'
答:
0赞
KungPhoo
3/10/2023
#1
我通过访问 HEAPU8 对象让它工作:
glb_emscripten_call:function( ioStringPointer )
{
// Read the string from the pointer
var str = '';
for(var i = 0; i<10; ++i){
var ascii = HEAPU8[ioStringPointer + i];
if(ascii == 0){break;}
str += String.fromCharCode(ascii);
}
// Overwrite the string at that pointer (must have allocated enough memory)
str = 'KungFu';
for(var i = 0; i<str.length; ++i){
HEAPU8[ioStringPointer + i] = str.charCodeAt(i);
}
HEAPU8[ioStringPointer + str.length] = 0;
}
上一个:自动将参数传递给 super()
下一个:将类方法作为参数与参数一起传递
评论