Kotlin/Native 常见问题解答
如何运行我的程序?
定义一个顶层函数 fun main(args: Array<String>),或者如果您对传入的实参不感兴趣,只需定义 fun main(),并请确保它不在软件包中。 此外,编译器开关 -entry 可用于将任何接收 Array<String> 或不接收实参且返回 Unit 的函数作为入口点。
Kotlin/Native 的内存管理模型是什么?
Kotlin/Native 使用一种自动内存管理方案,类似于 Java 或 Swift 提供的方案。
如何创建共享库?
在您的 Gradle 构建文件中使用 -produce dynamic 编译器选项或 binaries.sharedLib():
kotlin {
iosArm64("mylib") {
binaries.sharedLib()
}
}它会生成一个特定于平台的共享对象(Linux 上为 .so,macOS 上为 .dylib,Windows 目标平台上为 .dll)以及一个 C 语言头文件,允许从 C/C++ 代码中使用 Kotlin/Native 程序中所有可用的公开 API。
如何创建静态库或对象文件?
在您的 Gradle 构建文件中使用 -produce static 编译器选项或 binaries.staticLib():
kotlin {
iosArm64("mylib") {
binaries.staticLib()
}
}它会生成一个特定于平台的静态对象(.a 库格式)以及一个 C 语言头文件,允许您从 C/C++ 代码中使用 Kotlin/Native 程序中所有可用的公开 API。
如何在公司代理后运行 Kotlin/Native?
由于 Kotlin/Native 需要下载特定于平台的工具链,您需要指定 -Dhttp.proxyHost=xxx -Dhttp.proxyPort=xxx 作为编译器或 gradlew 的实参,或者通过 JAVA_OPTS 环境变量进行设置。
如何为我的 Kotlin 框架指定自定义 Objective-C 前缀/名称?
使用 -module-name 编译器选项或匹配的 Gradle DSL 语句。
kotlin {
iosArm64("myapp") {
binaries.framework {
freeCompilerArgs += listOf("-module-name", "TheName")
}
}
}kotlin {
iosArm64("myapp") {
binaries.framework {
freeCompilerArgs += ["-module-name", "TheName"]
}
}
}如何重命名 iOS 框架?
iOS 框架的默认名称为 <项目名称>.framework。 要设置自定义名称,请使用 baseName 选项。这也会同时设置模块名称。
kotlin {
iosArm64("myapp") {
binaries {
framework {
baseName = "TheName"
}
}
}
}如何为我的 Kotlin 框架启用 bitcode?
Bitcode 嵌入在 Xcode 14 中被弃用,并在 Xcode 15 中针对所有 Apple 目标被移除。 自 Kotlin 2.0.20 起,Kotlin/Native 编译器不再支持 bitcode 嵌入。
如果您正在使用较早版本的 Xcode 但希望升级到 Kotlin 2.0.20 或更高版本,请在您的 Xcode 项目中禁用 bitcode 嵌入。
如何从不同协程安全地引用对象?
要在 Kotlin/Native 的多个协程之间安全地访问或更新对象,请考虑使用并发安全结构,例如 @Volatile 和 AtomicReference。
使用 @Volatile 注解一个 var 属性。 这会使该属性支持字段的所有读写操作都具有原子性。此外,写入操作会立即对其他线程可见。当另一个线程访问此属性时,它不仅能观察到更新后的值,还能观察到更新之前发生的更改。
或者,使用 AtomicReference,它支持原子读取和更新。在 Kotlin/Native 上,它包装了一个 volatile 变量并执行原子操作。 Kotlin 还为针对特定数据类型定制的原子操作提供了一系列类型。您可以使用 AtomicInt、AtomicLong、AtomicBoolean、AtomicArray,以及 AtomicIntArray 和 AtomicLongArray。
有关访问共享可变状态的更多信息,请参阅协程文档。
如何使用未发布版本的 Kotlin/Native 编译我的项目?
首先,请考虑尝试预览版本。
