本文来自:www.kotliner.cn,文中链接请点击阅读原文查看
内容提要:本文通过 gradle 以及 makefile 两种方式对 Kotlin Native 项目进行构建,提供了详细的从 C 源码编译、到 Kotlin Native 项目的编译及运行的方法,以及该过程中遇到的问题和解决方案,涉及两处对编译器的修改也已经提交 pr。
源码地址:https://github.com/enbandari/Kotlin-Native-Demo
最近因为 www.kotliner.cn上线的原因,一直没顾上对 Kotlin Native 进行体验,现在 Kotlin Native 预览版发布一周了,我来给大家较为详细地介绍一下它的一些相关内容。
1、Kotlin Native 是什么
Kotlin Native 不是 Jni 的概念,它不仅仅是要与底层代码比如 C、C++ 交互,而且还要绕过 Jvm 直接编译成机器码供系统运行。也就是说,Kotlin 准备丢掉 Java 这根拐杖了!
其实我第一次看到 Native 这个名字的时候很自然的想到了 Jni,Kotlin 跑在 Jvm 上面,使用 Jni 与底层代码交互是一件再正常不过的事情了,至于搞这么大动静么,不过等我进行了一番了解之后才发现,Kotlin 项目组的野心真是不小,Java 诞生这么多年了,也没有做过编译成除 Java 虚拟机字节码以外的字节码的事情,Kotlin 才出来多久啊,果然具有革命性。
所以以后有人再问你,什么是 Kotlin,你要回答,Kotlin 是一门很牛逼的静态语言(而不是之前经常说的 Kotlin 是一门运行在 Jvm、Android、FE 上的静态语言了),反正你能想到的,Kotlin 项目组都想干。。
2、如何编写 Kotlin Native 程序
现在 Kotlin Native 刚刚处在技术预览阶段,离商用目测还需要至少一年的时间(小小地激动一下,2018年会不会发布正式版呢),性能优化、标准库、反射等等功能现在尚处于早期的状态,所以大家也没必要强求。下面我给大家介绍下怎么编译出一个 HelloWorld 工程。
2.1 准备编译器
编译器目前有 Mac、Linux 两个版本,可以编出运行在 树莓派、iOS 以及 OS X 和 Linux 系统上的程序(Windows 真可怜。。),下面的演示运行在 Mac OS X 10.11.6 上,与 Linux 的小伙伴可能稍微一些差异。
编译器官方有现成可用的版本,下载地址如下:
不过呢,也建议小伙伴们直接 clone 编译器源码编译,没有复杂的编译步骤,两行命令即可搞定编译。
代码拖下来之后,保证网络畅通,运行:
$ ./gradlew dependencies:update
这一步是下载依赖,官方源码使用了 gradle-wrapper,所以如果你本地没有 gradle 3.1 的话也会自动去下载。这一步就是下载下载下载,所以一定要注意,出错的话基本上就是网络问题。运行完成之后,你就会在 dist/dependencies 目录下面看到下载的各种依赖了。
接着就可以编译了:
./gradlew dist
编译时间不长,如果出现错误,可以 clean 多试几次。。编译完之后我们就可以得到编译器一份啦。
2.2 Gradle 版 HelloWorld
下面我们先在 IntelliJ 中创建一个普通的 Gradle 工程,创建好之后,修改 build.gradle 文件,改成下面这样:
buildscript {
repositories {
mavenCentral()
maven {
url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies"
}
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.1"
}
}
apply plugin: 'konan'
konanInterop {
kotliner {
defFile 'kotliner.def' // interop 的配置文件
includeDirs "src/c" // C 头文件目录,可以传入多个
//pkg "cn.kotliner.native" // C 头文件编译后映射为 Kotlin 的包名,这个有问题,后面我们再说
}
}
konanArtifacts {
Kotliner {
inputFiles fileTree("src/kotlin") //kotlin 代码配置,项目入口 main 需要定义在这里
useInterop 'kotliner' //使用前面的 interop 配置
nativeLibrary file('src/c/cn_kotliner.bc') //自己编译的 llvm 字节格式的依赖
target 'macbook' // 编译的目标平台
}
}
我们可以看到,konan 就是用来编译 Kotlin 为 native 代码的插件,konanArtifacts 配置我们的项目,konanInterop 主要用来配置 Kotlin 调用 C 的接口。有关插件的配置,可以参考官方文档:GRADLE_PLUGIN。