跳转到内容
Skip 中文站
3.2k

SkipBridge

SkipBridge 为 Skip Fuse 应用提供 Swift 与 Kotlin/Java 之间的双向桥接。

注意: 大多数开发者不会直接使用 SkipBridge。它是一个内部基础设施软件包,为 Fuse 模式下透明的 Swift/Kotlin 互操作提供支持。当你在模块的 skip.yml 中启用 bridging: true 时,Skip 构建插件会自动生成调用 SkipBridge 的 JNI 胶水代码,无需手动集成。

有关可桥接的 Swift 语言特性和类型的完整参考,请参阅桥接参考文档。

SkipBridge 让编译后的 Swift 代码(通过 Swift Android SDK 运行)与 Kotlin/Java 代码(在 JVM 或 Android 运行时上运行)能够跨越 JNI 边界相互调用。它负责处理:

  • 对象生命周期管理——Kotlin 持有的 Swift 对象通过不透明的 Int64 指针(SwiftObjectPointer)进行引用计数,既可防止对象过早释放,也能避免保留循环。
  • 类型转换——自动在 Swift 与 Kotlin/Java 类型之间进行封送处理,例如 Array ↔ List、Dictionary ↔ Map、Date ↔ java.util.Date、URL ↔ java.net.URI、UUID ↔ java.util.UUID。
  • 闭包桥接——Swift 闭包映射为 Kotlin FunctionN lambda 对象,最多支持 5 个参数,并支持 async/suspend 变体。
  • 继承关系——桥接后会保留跨边界的类继承层级,最多支持 4 层继承。
  • Async/await——Swift 异步函数和属性会桥接为 Kotlin suspend 函数,AsyncStream/AsyncThrowingStream 会桥接为 kotlinx.coroutines.flow.Flow。
  • 动态访问——AnyDynamicObject 基于 @dynamicMemberLookup,让 Swift 能够访问任意 Kotlin/Java 对象。其底层由 Kotlin Reflector 类支持,该类负责属性访问以及具备重载解析能力的方法分派。

核心 Swift 类型位于 SkipBridge 模块中:

类型用途
SwiftObjectPointerInt64 的类型别名,表示指向 Swift 对象的不透明指针,并通过 Unmanaged 的 retain/release 语义进行管理
BridgedToKotlin标记需要投射到 Kotlin 的 Swift 类型的协议
BridgedFromKotlin标记从 Kotlin 投射回 Swift 的类型的协议
BridgedTypes列举所有可桥接类型(基本类型、集合、日期、URL 等)及其转换逻辑的枚举
AnyDynamicObject使用反射调用任意 Kotlin/Java 对象的 @dynamicMemberLookup 包装器
JavaBackedClosure<R>包装 Kotlin lambda(JObject),使其可从 Swift 调用;支持 0~5 个参数以及 suspend 变体
SwiftEquatable / SwiftHashable将 Swift 对 Equatable/Hashable 协议的遵循关系投射为 Kotlin 的 equals/hashCode 的包装器

skip.bridge.Reflector 类为 AnyDynamicObject 提供 Kotlin 端的反射引擎。它支持:

  • 使用类名和参数构造 Kotlin 对象
  • 按名称读取和写入属性,并进行类型转换
  • 调用方法,并根据参数兼容性评分解析重载

System.swift 负责在多种构建场景下,将编译后的 Swift .so 库加载到 JVM/Android 运行时中。这些场景包括:由 Xcode 启动并嵌入 JVM 的测试、由 SwiftPM 启动的测试、通过 Robolectric 执行的 Gradle 测试,以及通过 System.loadLibrary 在 Android 设备上执行。

SkipBridge 本身配置为原生模式模块(其 skip.yml 中设置了 mode: 'native')。它的 Gradle 构建配置会协调 Android NDK 工具链,将 Swift 源代码编译为 .so 共享库,并打包到应用的 JNI 库目录中。

依赖 SkipBridge 的模块通常会在自己的 skip.yml 中声明桥接:

skip:
mode: 'native'
bridging: true

可选的 kotlincompat 桥接模式会将 Swift 集合和标准库类型转换为对应的 Kotlin 类型,例如 Array → kotlin.collections.List,方便纯 Kotlin 代码以更自然的方式使用:

skip:
mode: 'native'
bridging:
enabled: true
options: 'kotlincompat'
  • swift-jni ↗——JNI C 头文件和 Swift JNI 包装器
  • SkipLib——用于 Skip 的 Swift 标准库扩展

skiptools/skip-bridge ↗ 最近发布的 10 个版本:

完整历史记录:github.com/skiptools/skip-bridge/releases ↗ — .atom 订阅源 ↗