Emscripten JS 库 - 传递字符串

Emscripten JS library - pass strings

提问人:KungPhoo 提问时间:3/7/2023 更新时间:3/10/2023 访问量:192

问:

我想在 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'

JavaScript 参数传递 emscripten

评论


答:

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;
    }