You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Emscripten JS库中C++与JS字符串交互问题求助

Emscripten中C++与JS的字符串交互问题解决

问题场景

我需要在Emscripten库中实现C与JS的字符串交互,现有C代码和关联的JS库代码如下,但遇到两个核心问题:

  1. 如何将C指针地址转换为JS字符串?
  2. 如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:12:27