Expo原生模块调用JavaScriptValue.getObject()时JSIContext不存在
Expo原生模块中JavaScriptValue转对象报错“JSIContext for the given runtime doesn't exist”的解决方法
核心修复步骤
1. 调整函数参数类型
将Kotlin模块中的setValueAsync函数参数直接声明为JavaScriptObject,避免手动转换JavaScriptValue:
AsyncFunction("setValueAsync") { value: JavaScriptObject -> // 直接使用value对象,无需调用getObject() // 示例:获取对象中的属性 val message = value.getString("m") sendEvent("onChange", mapOf( "value" to message )) }
如果需要兼容多种参数类型(基础类型+对象),可以使用JavaScriptValue但需通过asObject()安全转换,并在JS线程执行操作:
AsyncFunction("setValueAsync") { value: JavaScriptValue -> runOnJavaScriptThread { if (value.isObject()) { val o = value.asObject() val message = o.getString("m") } } sendEvent("onChange", mapOf( "value" to "set" )) }
2. 确认模块JSI配置
检查模块根目录下的expo-module.config.json(或package.json中的expo字段),确保启用JSI互操作:
{ "name": "demo", "platforms": ["android", "ios"], "jsi": true }
3. 重新构建项目
修改配置后,清理并重新构建原生模块:
cd example npx expo prebuild --clean npm run android
问题原因
当调用JavaScriptValue.getObject()时,需要当前上下文存在有效的JSIContext。Expo模块框架中,若未直接声明JavaScriptObject参数,或未正确启用JSI配置,会导致JSIContext无法绑定到当前调用,从而抛出异常。直接使用JavaScriptObject作为参数类型,框架会自动处理JSIContext的初始化与绑定,避免手动转换时的上下文缺失问题。
内容的提问来源于stack exchange,提问作者guodman
相关产品推荐
相关产品推荐

