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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 02:52:33