Часто задаваемые вопросы о Kotlin/Native
Как запустить программу?
Определите функцию верхнего уровня fun main(args: Array<String>) или просто fun main(), если вам не нужны переданные аргументы. Убедитесь, что она не находится в пакете. Также можно использовать параметр компилятора -entry, чтобы назначить точкой входа любую функцию, принимающую Array<String> или не принимающую аргументы и возвращающую Unit.
Какова модель управления памятью в Kotlin/Native?
В Kotlin/Native используется автоматическая схема управления памятью, аналогичная схемам в Java и Swift.
Как создать динамическую библиотеку?
Используйте параметр компилятора -produce dynamic или binaries.sharedLib() в файле сборки Gradle:
kotlin {
iosArm64("mylib") {
binaries.sharedLib()
}
}
В результате создаются платформенный общий объект (.so в Linux, .dylib в macOS и .dll для целей Windows) и заголовочный файл языка C. Это позволяет использовать из кода C/C++ все общедоступные API программы на Kotlin/Native.
Пройдите руководство по созданию динамической библиотеки на Kotlin/Native
Как создать статическую библиотеку или объектный файл?
Используйте параметр компилятора -produce static или binaries.staticLib() в файле сборки Gradle:
kotlin {
iosArm64("mylib") {
binaries.staticLib()
}
}
В результате создаются платформенный статический объект (формат библиотеки .a) и заголовочный файл языка C. Это позволяет использовать из кода C/C++ все общедоступные API программы на Kotlin/Native.
Как запускать Kotlin/Native за корпоративным прокси-сервером?
Поскольку Kotlin/Native необходимо загрузить платформенный набор инструментов, укажите -Dhttp.proxyHost=xxx -Dhttp.proxyPort=xxx в качестве аргумента компилятора или gradlew либо задайте его с помощью переменной среды JAVA_OPTS.
Как задать пользовательский префикс или имя Objective-C для фреймворка Kotlin?
Используйте параметр компилятора -module-name или соответствующую инструкцию DSL Gradle.
kotlin {
iosArm64("myapp") {
binaries.framework {
freeCompilerArgs += listOf("-module-name", "TheName")
}
}
}
kotlin {
iosArm64("myapp") {
binaries.framework {
freeCompilerArgs += ["-module-name", "TheName"]
}
}
}
Как переименовать фреймворк iOS?
Имя фреймворка iOS по умолчанию — <project name>.framework. Чтобы задать другое имя, используйте параметр baseName. При этом также будет задано имя модуля.
kotlin {
iosArm64("myapp") {
binaries {
framework {
baseName = "TheName"
}
}
}
}
Как включить bitcode для фреймворка Kotlin?
Встраивание bitcode устарело в Xcode 14 и было удалено в Xcode 15 для всех целевых платформ Apple. Начиная с Kotlin 2.0.20 компилятор Kotlin/Native не поддерживает встраивание bitcode.
Если вы используете более ранние версии Xcode, но хотите перейти на Kotlin 2.0.20 или более поздние версии, отключите встраивание bitcode в проектах Xcode.
Как получать более подробные отчеты о сбоях для 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?
Сначала попробуйте предварительные версии.
Если вам нужна еще более свежая версия для разработки, можно собрать Kotlin/Native из исходного кода: клонируйте репозиторий Kotlin и выполните эти действия.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-faq.html