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
FunctionNlambda 对象,最多支持 5 个参数,并支持 async/suspend 变体。 - 继承关系——桥接后会保留跨边界的类继承层级,最多支持 4 层继承。
- Async/await——Swift 异步函数和属性会桥接为 Kotlin suspend 函数,
AsyncStream/AsyncThrowingStream会桥接为kotlinx.coroutines.flow.Flow。 - 动态访问——
AnyDynamicObject基于@dynamicMemberLookup,让 Swift 能够访问任意 Kotlin/Java 对象。其底层由 KotlinReflector类支持,该类负责属性访问以及具备重载解析能力的方法分派。
Swift 端
Section titled “Swift 端”核心 Swift 类型位于 SkipBridge 模块中:
| 类型 | 用途 |
|---|---|
SwiftObjectPointer | Int64 的类型别名,表示指向 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 的包装器 |
Kotlin 端
Section titled “Kotlin 端”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 个版本:
- 版本 0.17.3 ↗ — 2026-08-19
- 版本 0.17.2 ↗ — 2026-06-13
- 版本 0.17.1 ↗ — 2026-05-22
- 版本 0.17.0 ↗ — 2026-05-17
- 版本 0.16.7 ↗ — 2026-02-18
- 版本 0.16.6 ↗ — 2026-02-04
- 版本 0.16.5 ↗ — 2026-01-13
- 版本 0.16.4 ↗ — 2026-01-05
- 版本 0.16.3 ↗ — 2025-11-25
- 版本 0.16.2 ↗ — 2025-09-20
完整历史记录:github.com/skiptools/skip-bridge/releases ↗ — .atom 订阅源 ↗