Kotlin/Native¶
Kotlin/Native 把 Kotlin 编译为无需虚拟机即可运行的原生二进制。它基于 LLVM 后端,并提供 Kotlin 标准库的 Native 实现。
为什么需要 Kotlin/Native¶
Kotlin/JVM 依赖 JVM,Kotlin/JS 依赖 JavaScript 环境。某些场景不适合或不能使用虚拟机:
- iOS。
- 嵌入式设备。
- 命令行原生工具。
- 需要静态或动态原生库的项目。
- 与 C、C++、Swift、Objective-C 深度互操作的项目。
Kotlin/Native 可以生成可执行文件、静态库、动态库,也可以生成 Apple 平台使用的 framework。
支持平台¶
Kotlin/Native 支持多个目标,包括:
- Linux。
- Windows,通常通过 MinGW。
- Android NDK。
- Apple 平台:macOS、iOS、tvOS、watchOS。
编译 Apple 目标通常需要安装 Xcode 和命令行工具。CI 上构建 iOS/macOS 目标时也需要 macOS runner。
与 C 互操作¶
Kotlin/Native 可以调用 C 库。通常通过 cinterop 工具读取头文件并生成 Kotlin 绑定。
示意:
val home = platform.posix.getenv("HOME")
实际项目会配置 .def 文件、头文件路径、链接参数等。适合复用已有 C 库、系统库或跨平台底层能力。
与 Swift / Objective-C 互操作¶
Kotlin/Native 可以生成 iOS/macOS framework,让 Swift 或 Objective-C 调用 Kotlin 代码。
典型 KMP iOS 架构:
commonMain: 业务逻辑、模型、网络抽象
iosMain: iOS 平台实现
生成 framework: 给 Swift/SwiftUI 调用
Swift 调用体验与 Kotlin API 设计密切相关。过度使用复杂泛型、协程 Flow、内联值类等特性时,Swift 暴露形态可能不够自然,需要用 facade API 包装。
平台库¶
Kotlin/Native 自带一些平台库,帮助访问 POSIX、Foundation、Metal、OpenGL、gzip 等平台能力。
这些库让 Kotlin 可以直接触达原生生态,但也意味着代码可能变得平台相关。平台相关代码应放在对应 source set,例如 iosMain、macosMain,不要放入 commonMain。
内存管理¶
Kotlin/Native 使用自动内存管理,带有自己的 tracing garbage collector,并与 Swift/Objective-C 的 ARC 集成。
这比手写 C/C++ 内存管理安全得多,但仍要理解跨语言边界:
- Kotlin 对象暴露给 Swift/Objective-C 后的生命周期。
- 回调闭包捕获对象。
- Native 资源句柄需要显式关闭。
- C 指针和内存区域需要谨慎处理。
与 Java 的区别¶
Java 开发者需要注意:
- 没有 JVM,不存在 Java 标准库。
- 不能使用 JVM-only 库,例如 Spring、Hibernate、普通 Java IO API。
- 反射能力与 JVM 不同。
- 线程和并发模型要按 Native 目标理解。
- 构建产物是原生二进制或 framework,不是 jar。
如果你的代码依赖大量 Java 生态,Kotlin/Native 不是直接替代品。它适合把 Kotlin 带到 JVM 之外的平台。
与 Multiplatform 的关系¶
Kotlin/Native 是 Kotlin Multiplatform 的重要目标之一。常见用法不是写一个完全 Native 的应用,而是在 KMP 项目中为 iOS、macOS、Linux 等目标提供编译能力:
kotlin {
iosArm64()
iosSimulatorArm64()
linuxX64()
}
公共业务逻辑放在 commonMain,Native 平台能力放在具体 source set。
适用场景¶
适合:
- Android+iOS 共享业务逻辑。
- 原生命令行工具。
- 调用 C 库或系统库。
- 生成给 Swift/Objective-C 使用的 framework。
- 不希望引入 JVM 的原生部署环境。
不适合:
- 依赖大量 JVM 框架的后端服务。
- 需要完整 Java 反射生态的框架。
- 团队没有 Native 平台调试和构建经验,却要一次覆盖很多目标。
实践建议¶
- 从 KMP 的 iOS 共享逻辑开始,不要一开始就追求所有 Native 目标。
- Native 代码中谨慎处理 C 指针、资源释放和回调生命周期。
- 给 Swift 调用的 API 要专门设计,不要直接暴露复杂 Kotlin 内部模型。
- JVM-only 依赖不能进入 Native source set。
- Apple 目标构建要提前规划 Xcode、签名和 CI 环境。
参考¶
- 官方 Kotlin/Native 文档:https://kotlinlang.org/docs/native-overview.html