6.3.12 Kotlin/Native 常见问题
3 分钟阅读
6.3.12 Kotlin/Native 常见问题
如何运行我的程序?
定义一个顶层函数 fun main(args: Array<String>);如果你不关心传入的实参,也可以只写 fun main(),请确保它不在任何包中。此外,还可以使用编译器开关 -entry,把任何接收 Array<String> 或不接收参数、返回 Unit 的函数设为入口点。
Kotlin/Native 的内存管理模型是什么?
Kotlin/Native 使用与 Java 或 Swift 类似的自动内存管理方案。
如何创建共享库?
使用 -produce dynamic 编译器选项,或在 Gradle 构建文件中使用 binaries.sharedLib():
| |
它会生成平台特定的共享对象(Linux 上为 .so,macOS 上为 .dylib,Windows 目标上为 .dll)以及一个 C 语言头文件,让你可以从 C/C++ 代码中使用 Kotlin/Native 程序中所有公开 API。
如何创建静态库或目标文件?
使用 -produce static 编译器选项,或在 Gradle 构建文件中使用 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
| |
Groovy
| |
如何重命名 iOS 框架?
iOS 框架的默认名称是 <project name>.framework。要设置自定义名称,请使用 baseName 选项。这同时也会设置模块名。
| |
如何为我的 Kotlin 框架启用 bitcode?
Bitcode 嵌入在 Xcode 14 中已被弃用,并在 Xcode 15 中针对所有 Apple 目标被移除。从 Kotlin 2.0.20 起,Kotlin/Native 编译器不再支持 bitcode 嵌入。
如果你使用的是较早版本的 Xcode,但想升级到 Kotlin 2.0.20 或更高版本,请在你的 Xcode 项目中禁用 bitcode 嵌入。
如何为 iOS 获得更好的崩溃报告?
当未被处理的 Kotlin 异常传播到 iOS 代码时,崩溃报告工具可能显示一条含糊的报告,指出这是 Kotlin/Native 的内部问题,而不是异常实际抛出的代码行。这是因为在记录崩溃时,原始的 Kotlin 堆栈轨迹已经丢失了。
你可以用第三方方案绕过这个问题,例如 NSExceptionKt,它会把未捕获的 Kotlin 异常转换为 NSException 实例,从而使你的崩溃报告工具捕获到正确的堆栈轨迹。它为流行的崩溃报告工具提供了专门的集成:
如何在不同协程之间安全地引用对象?
要在 Kotlin/Native 中跨多个协程安全地访问或更新对象,请考虑使用并发安全的构造,例如 @Volatile 和 AtomicReference。
使用 @Volatile 标注 var 属性。这样可以让对该属性幕后字段的所有读写都成为原子操作。此外,写入会立即对其他线程可见。当另一个线程访问该属性时,它不仅能观察到更新后的值,还能观察到更新之前发生的所有改动。
或者使用 AtomicReference,它支持原子读取和更新。在 Kotlin/Native 上,它包装了一个 volatile 变量并执行原子操作。Kotlin 还针对特定数据类型提供了一组原子操作类型。你可以使用 AtomicInt、AtomicLong、AtomicBoolean、AtomicArray,以及 AtomicIntArray 和 AtomicLongArray。
关于访问共享可变状态的更多信息,请参阅协程文档。
如何用未发布的 Kotlin/Native 版本编译我的项目?
首先,请考虑试用预览版本。