Emscripten JS库中C++与JS字符串交互问题求助
Emscripten中C++与JS的字符串交互问题解决
问题场景
我需要在Emscripten库中实现C与JS的字符串交互,现有C代码和关联的JS库代码如下,但遇到两个核心问题:
- 如何将C指针地址转换为JS字符串?
- 如何将JS字符串的字节复制到该C指针指向的内存?
另外尝试使用stringToUTF8()时添加import Module from './myapp.js',出现语法错误:“Cannot use import statement outside a module”。
现有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)
解决方案
1. C指针转JS字符串
Emscripten内置UTF8ToString()工具函数,可直接从C指针指向的UTF-8内存中读取字符串,无需手动处理内存操作,在JS库环境中直接调用即可:
var myString = UTF8ToString(ioStringPointer);
2. JS字符串复制到C指针内存
使用Emscripten内置的stringToUTF8()方法,它会将JS字符串编码为UTF-8并复制到指定的C内存地址,第三个参数传入缓冲区总大小(包含末尾\0),避免溢出:
var strOut = 'Hello World'; stringToUTF8(strOut, ioStringPointer, 2048);
解决import Module语法错误
在Emscripten的JS库文件中,无需手动导入Module——库代码会被合并到Emscripten生成的模块环境中,内置工具函数可直接全局访问,直接移除import Module from './myapp.js'即可。
修改后的完整JS库代码
var LibraryGLB = { $GLB__deps: ['$Browser'], $GLB : { glb_emscripten_call:function( ioStringPointer ) { // 从C指针读取字符串 var myString = UTF8ToString(ioStringPointer); alert(myString); // 将JS字符串写入C指针指向的内存 var strOut = 'Hello World'; stringToUTF8(strOut, ioStringPointer, 2048); }, end_of_struct:0 } }; autoAddDeps(LibraryGLB, '$GLB'); mergeInto(LibraryManager.library, LibraryGLB)
C++代码补充修正
原代码中glb_emscripten_call(pBuffer);的pBuffer应为定义好的静态缓冲区outp,修改后:
glb_emscripten_call(outp); // 传递静态缓冲区指针给JS
内容的提问来源于stack exchange,提问作者KungPhoo
相关产品推荐
相关产品推荐

