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

React中运行旧Emscripten项目调用addFunction时wasmTable为空的问题

问题:React中运行旧Emscripten项目调用addFunction时出现wasmTable为null的错误

调用addFunction时触发以下错误:

core.js:1981 Uncaught TypeError: Cannot read properties of undefined (reading 'grow')
    at getEmptyTableSlot (core.js:1981:1)
    at Object.addFunction (core.js:2013:1)
    at CoreBridge (CoreBridge.js:42:1)

错误根源是getEmptyTableSlot函数中调用grow(1)时wasmTable为null:

var getEmptyTableSlot = () => {
    // Reuse a free index if there is one, otherwise grow.
    if (freeTableIndexes.length) {
        return freeTableIndexes.pop();
    }
    // Grow the table
    try {
        wasmTable.grow(1);

已尝试的操作

  • 切换-sWASM=0和-sWASM=1两种模式,均在同一位置触发错误
  • 确认-sWASM=1时wasm文件已正确加载(移除服务器上的wasm文件会出现不同的加载错误)
  • 修改Makefile中多个编译选项,无明显效果

当前使用的链接标志:

LDFLAGS =   --js-library platformDefinitions.js                                 \
            --post-js post.js                                                   \
            -s NO_DYNAMIC_EXECUTION=1                                           \
            -s RESERVED_FUNCTION_POINTERS=6                                     \
            -s EXPORTED_RUNTIME_METHODS=cwrap,addFunction,wasmTable             \
            -s ALLOW_TABLE_GROWTH                                               \
            -s ENVIRONMENT=web                                                  \
            -s EXPORTED_FUNCTIONS='[                                            \
                "_SCB_SDKInit",                                                 \
                "_SCB_SDKFinal",                                                \
                "_SCB_registerReceivedAPIResponseCallback",                     \
                "_SCB_unregisterReceivedAPIResponseCallback",                   \
                "_SCB_registerReceivedSistrCallback",                           \
                "_SCB_unregisterReceivedSistrCallback",                         \
                "_SCB_registerAPICommandFailedCallback",                        \
                "_SCB_unregisterAPICommandFailedCallback",                      \
                "_SCB_sendSistr",                                               \
                "_SCB_sendAPICommand",                                          \
                "_SCB_freeOutData",                                             \
                "_SCB_createToy",                                               \
                "_SCB_destroyToy",                                              \
                "_SCB_createObject",                                            \
                "_SCB_destroyObject"                                            \
            ]'

解决思路

  • 检查Emscripten版本兼容性:旧项目可能依赖特定版本的Emscripten,新版本在wasmTable初始化逻辑上可能有变更,尝试回退到项目最初使用的Emscripten版本测试
  • 确保运行时完全初始化:在React中调用addFunction前,必须等待Emscripten的Module.onRuntimeInitialized回调执行完成,再执行CoreBridge中的逻辑
  • 调整函数表相关参数:尝试增大RESERVED_FUNCTION_POINTERS的值(比如从6调整到12或更高),减少初始阶段需要grow表的情况;同时确认ALLOW_TABLE_GROWTH在WASM=0/1模式下均能正常生效
  • 临时禁用NO_DYNAMIC_EXECUTION:该选项禁用动态代码生成,可能影响函数表的初始化流程,尝试移除-s NO_DYNAMIC_EXECUTION=1后重新编译测试
  • 排查打包工具影响:React的webpack等打包工具可能混淆或修改了Emscripten生成的JS代码结构,尝试将Emscripten生成的JS文件作为外部资源直接引入,避免打包过程干扰变量初始化
  • 手动验证wasmTable状态:在调用addFunction前,打印Module.wasmTable确认是否存在,若不存在,结合Emscripten文档确认正确的初始化流程,避免提前调用API

内容的提问来源于stack exchange,提问作者Brian S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:25:04