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
相关产品推荐
相关产品推荐

