编辑本页

基本 Kotlin/Native 应用程序

最近更新 2019-04-15
来看看如何编译我们的第一个 Kotlin/Native 应用程序并且在 IDE 中打开它

在本教程中,我们将看到如何:

获取编译器

Kotlin/Native 编译器可以被用于 macOS、Linux 以及 Windows。它支持不同的目标平台包括 iOS(arm32、arm64、simulator x86_64),Windows(mingw32 以及 x86_64), Linux(x86_64、arm64、MIPS),macOS(x86_64),Raspberry PI、SMT32、WASM。所有的目标平台列表我们可以在 Kotlin/Native 总览中查看。 虽然跨平台编译是可行的, (即,使用一个平台为另一个平台编译),但在这个第一篇教程中我们仅仅为当前运行的系统进行编译。

使用 Kotlin/Native 编译器的最好的方式是去构建一个系统。 它有助于下载与缓存 Kotlin/Native 编译器二进制文件与库传递依赖,并运行编译器以及测试。 它同样也缓存编译结果。 IDE 还可以使用构建系统来了解项目布局。

Kotlin/Native 通过 Gradlekotlin-multiplatform 插件来使用构建系统。 我们将在下面介绍如何配置 Gradle 构建。 对于某些极端情况,Kotlin/Native 编译器仍然可以从 GitHub Kotlin 发行版页面手动获取(不推荐)。 在本教程中,我们将专注于使用 Gradle 进行构建。

虽然编译器的输出没有任何依赖项或虚拟机要求, 但编译器本身以及 Gradle 构建系统需要 Java 1.8 或 11 运行时。在网页 https://jdk.java.net/11 或另外的源检查,JRE、OpenJDK 或 JDK 发行版。

创建 Hello Kotlin

我们的第一个应用程序只简单的使用标准输出打印一些文本。在我们的案例中文本是“Hello Kotlin/Native”。 我们可以打开自己最喜欢的 IDE 或编辑器并在名为 hello.kt 的文件中编写下面的代码:

fun main() {
  println("Hello Kotlin/Native!")
}

使用命令行编译代码

通过下载编译器手动生成一个 hello.kexe(Linux 与 macOS)或 hello.exe(Windows)二进制文件

kotlinc-native hello.kt -o hello

虽然从控制台编译似乎很简单,但我们应该注意到它对于包含数百个文件与库的大型项目来说,不能很好地扩展。 除此之外,命令行方法没有向 IDE 解释如何打开这样的项目、 源所在的位置、使用的依赖项、或依赖项的下载方式等。

创建一个 Kotlin/Native Gradle 工程

我们只需点击 IntelliJ IDEA 中的 New Project 引导项,就可以创建一个新的 Kotlin/Native 工程。 点击 Kotlin 选项,并选择 Native | Gradle 配置项来生成工程。 为了更好地理解与解释正在发生的事情,在本教程中我们将手动创建工程。

我们首先来创建一个工程文件夹。本教程中的所有路径都与此文件夹相关。有时在添加新文件之前,必须创建缺少的目录。

Gradle 的构建脚本支持两种语言。我们有以下的两种选项:

  • build.gradle 文件中的 Groovy 脚本
  • build.gradle.kts 文件中的 Kotlin 脚本

Groovy 语言是被 Gradle 脚本支持时间最长的语言, 它利用了语言的动态类型以及运行时特性的强大功能。 有时维护 Groovy 构建脚本可能会更困难。IDE 正在苦苦挣扎于通过 Groovy 的动态特性来提供有用的预测或代码补全。

Kotlin 作为一种静态类型的编程语言非常适合编写 Gradle 构建脚本。 由于静态类型推断,Kotlin 编译器可以更早地检测到错误并显示重要的编译错误消息和警告。 IDE 与编译器都可以使用有关类型的信息进行推断给定范围内的可用函数与属性。

我们创建 build.gradle build.gradle.kts Gradle 构建文件中添加下面的内容:

plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.3.21'
}

repositories {
    mavenCentral()
}

kotlin {
  macosX64("native") {
    binaries {
      executable()
    }
  }
}

wrapper {
  gradleVersion = "5.3.1"
  distributionType = "ALL"
}
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.3.21'
}

repositories {
    mavenCentral()
}

kotlin {
  linuxX64("native") {
    binaries {
      executable()
    }
  }
}

wrapper {
  gradleVersion = "5.3.1"
  distributionType = "ALL"
}
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.3.21'
}

repositories {
    mavenCentral()
}

kotlin {
  mingwX64("native") {
    binaries {
      executable()
    }
  }
}

wrapper {
  gradleVersion = "5.3.1"
  distributionType = "ALL"
}
plugins {
    kotlin("multiplatform") version "1.3.21"
}

repositories {
    mavenCentral()
}

kotlin {
  macosX64("native") {
    binaries {
      executable()
    }
  }
}

tasks.withType<Wrapper> {
  gradleVersion = "5.3.1"
  distributionType = Wrapper.DistributionType.ALL
}
plugins {
    kotlin("multiplatform") version "1.3.21"
}

repositories {
    mavenCentral()
}

kotlin {
  linuxX64("native") {
    binaries {
      executable()
    }
  }
}

tasks.withType<Wrapper> {
  gradleVersion = "5.3.1"
  distributionType = Wrapper.DistributionType.ALL
}
plugins {
    kotlin("multiplatform") version "1.3.21"
}

repositories {
    mavenCentral()
}

kotlin {
  mingwX64("native") {
    binaries {
      executable()
    }
  }
}

tasks.withType<Wrapper> {
  gradleVersion = "5.3.1"
  distributionType = Wrapper.DistributionType.ALL
}

准备好的工程源可以直接下载 GitHub. GitHub. GitHub. GitHub. GitHub. GitHub.

现在需要在工程根目录创建一个空的 settings.gradle.kts settings.gradle 文件

根据目标平台,我们使用不同的函数, 例如 macosX64mingwX64linuxX64iosX64, 来创建一个 Kotlin 目标。函数名称是我们编译代码的平台。 这些函数可选地将目标名称作为参数,在我们的例子中是 "native"。 指定的 目标平台名称 用于在项目中生成源路径以及任务名称。

按照惯例,所有的源都位于 src/<target name>[Main|Test]/kotlin 文件夹。 它为每个目标平台都创建了 main 以及 test 源集。我们将 hello.kt 放置到我们之前在 src/nativeMain/kotlin 中创建的 main 源集文件夹中。 该 nativeMain 文件夹名称来源于我们在上面的构建脚本中指明的 "native" 目标平台名称。

工程已经准备好了。下一步是在 IntelliJ IDEA 中打开它。关于高级的构建场景, 建议参考更多细节文档。

想要在没有 IDE 的情况下继续使用都需要下载并安装 Gradle 构建工具。 确保使用正确的 Gradle 版本(例如 5.4.1 或者更新)。 当工程完成创建时运行 gradle wrapper 命令。 从 Gradle 开始 有更多关于如何开始使用 Gradle 工程的说明。

在 IDE 中打开这个工程

在本教程中我们使用 IntelliJ IDEA。 同时包括自由与开源的 IntelliJ IDEA 社区版本以及 IntelliJ IDEA 终极版。 如果有必要的话我们可以在 https://jetbrains.com/idea/download 同时下载并安装它们两者。 在 IntelliJ IDEA 中 Kotlin 插件已经被默认包含,但是我们仍然需要确保在 Language & Frameworks | Kotlin 选项下的 SettingsPreferences 的弹窗中 Kotlin 插件的版本是 1.3.50(或者更新)。

此时,我们应该有一个可以在 IDE 中打开的 Gradle 工程。 IntelliJ IDEA(CLion、AppCode 或 AndroidStudio)将帮助我们的工程生成一个 Gradle Wrapper 脚本。

现在我们在 IntelliJ IDEA 中打开这个工程。为此我们点击 File | Open… 并选择我们的 build.gradle.kts build.gradle 工程文件。

打开工程弹窗

确认 作为工程 打开文件。

Gradle 导入弹窗

在 Gradle 导入弹窗中选择 Use gradle 'wrapper' task configuration 选项来完成导入。 对于已有 Gradle wrapper 脚本的现有项目,则应该选择 Use default Gradle wrapper 选项替代之。

Gradle JVM 属性使用 Java 运行时版本 1.8 或 11 的路径。查看 https://jdk.java.net/11 或者 https://adoptopenjdk.net/ 来确认最优的 JRE、OpenJDK 或 JDK 发行版的版本。

运行应用程序

通常,一个原生二进制文件可以被编译为 debug 版本,这时它拥有更多的调试信息以及更少的优化,而 release 版本会有更多的优化被启用并且没有(或者至少是更少的)调试信息。 二进制文件会在 build/bin/native/debugExecutable 以及 build/bin/native/releaseExecutable 目录下分别被创建。该文件在 Linux 以及 macOS 上会拥有一个 .kexe 扩展名,而在 Windows 上的扩展名则是 .exe。使用以下命令指示构建生成二进制文件:

./gradlew build
./gradlew build
gradlew.bat build

重要的是要了解这是一个原生应用程序,所以不需要运行时环境或虚拟机。 我们现在可以从控制台运行已编译的二进制文件:

Hello Kotlin/Native!

除了构建任务之外,Gradle 构建还包括帮助通过直接运行应用程序的任务 runDebugExecutableNative 以及 runReleaseExecutableNative

这些任务的名称是根据公式创建的: run[Debug|Release]Executable<target name>, 其中 target name 我们在构建脚本中指定的大写目标名称: build.gradle.kts build.gradle 在我们的案例中,"native" 是构建后输出的文件。 我们在 IDE 中运行任务。为此,我们打开 Gradle Tool 窗口并在列表中找到任务: Gradle Import Dialog

或者,我们可以从控制台调用以下命令:

./gradlew runDebugExecutableNative
./gradlew runDebugExecutableNative
gradlew.bat runDebugExecutableNative

输出应该是:

> Task :runDebugExecutableNative
Hello Kotlin/Native!

BUILD SUCCESSFUL

接下来

Kotlin/Native 可以被用于许多目标平台或应用程序, 包括但不限于 macOS、Windows、Linux 以及 iOS

调用 C、Objective-C 或 Swift 在 Kotlin/Native 中是非常简单的。只需要查看我们的文档中的 C 互操作文档Objective-C 与 Swift 互操作文档。

至于 Kotlin 多平台项目,它可以用于将 Kotlin 代码共享至所有支持的平台。 查看文档在 iOS 与 Android 之间共享 Kotlin 代码或者查看如何构建自己的多平台库