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,例如 iosMainmacosMain,不要放入 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