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, позволяющий использовать все доступные публичные API вашей Kotlin/Native программы из кода C/C++. См. этот пример использования такого общего объекта для создания моста между Python и Kotlin/Native.
Как создать статическую библиотеку или файл объекта?
Используйте компиляторный параметр -produce static или binaries.staticLib() в Gradle.
kotlin {
iosArm64("mylib") {
binaries.staticLib()
}
}
Это создаст платформозависимый статический объект (в формате библиотеки .a) и заголовок на C, позволяющий использовать все публичные API вашей Kotlin/Native программы из кода C/C++.
Как запустить Kotlin/Native через корпоративный прокси?
Поскольку Kotlin/Native нужно загрузить платформозависимую среду компиляции, вам необходимо указать -Dhttp.proxyHost=xxx -Dhttp.proxyPort=xxx в качестве аргументов компилятора или gradlew, или установить его через переменную окружения JAVA_OPTS.
Как указать пользовательское префиксное имя для Objective-C моего Kotlin фреймворка?
Используйте компиляторный параметр -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 фреймворка - <project name>.framework. Чтобы указать пользовательское имя, используйте параметр baseName. Это также установит имя модуля.
kotlin {
iosArm64("myapp") {
binaries {
framework {
baseName = "TheName"
}
}
}
}
Как включить bitcode для моего Kotlin фреймворка?
По умолчанию плагин gradle добавляет его для iOS целей.
Для отладочной сборки он встраивает данные LLVM IR плацехолдеров в качестве маркера.
Для релизной сборки он встраивает bitcode в качестве данных.
Или параметры командной строки: -Xembed-bitcode (для релизной сборки) и -Xembed-bitcode-marker (для отладочной сборки).
Указание этого в Gradle DSL:
kotlin {
iosArm64("myapp") {
binaries {
framework {
// Use "marker" to embed the bitcode marker (for debug builds).
// Use "disable" to disable embedding.
embedBitcode("bitcode") // for release binaries.
}
}
}
}
Эти параметры имеют почти такой же эффект, как clang's -fembed-bitcode/-fembed-bitcode-marker и swiftc's -embed-bitcode/-embed-bitcode-marker.
Почему я вижу InvalidMutabilityException?
Скорее всего, это происходит потому, что вы пытаетесь изменить замороженный объект. Объект может перейти в замороженное состояние явно, как объекты, доступные из объектов, на которых вызвана функция kotlin.native.concurrent.freeze, или неявно (т.е. доступные из enum или глобального объекта-синглтона - см. следующий вопрос).
Как сделать объект-синглтон изменяемым?
В настоящее время объекты-синглтоны неизменяемы (т.е. замораживаются после создания), и это общепринятая практика - иметь неизменяемое глобальное состояние. Если по какой-то причине вам нужен изменяемый фрагмент состояния внутри такого объекта, используйте аннотацию @konan.ThreadLocal на объекте. Также класс kotlin.native.concurrent.AtomicReference может использоваться для хранения разных указателей на замороженные объекты в замороженном объекте и автоматического обновления этих указателей.
Как скомпилировать проект с предварительными версиями Kotlin/Native?
Сначала попробуйте предварительные версии.
В случае необходимости получения ещё более свежей версии разработки, вы можете собрать Kotlin/Native из исходного кода: клонировать репозиторий Kotlin и следовать эти шагам.
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-faq.html