В: Как запустить мою программу?
О: Определите функцию верхнего уровня 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++. См. samples/python_extension для примера использования такого общего объекта для создания моста между 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? (имя по умолчанию — <имя проекта>.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 может использоваться для хранения различных указателей на замороженные объекты в замороженном объекте и автоматического их обновления.
В: Как скомпилировать мой проект против master Kotlin/Native?
О: Следует выполнить одно из следующих действий:
Для командной строки вы можете скомпилировать с помощью gradle, как указано в README (и если вы получаете ошибки, вы можете попробовать выполнить ./gradlew clean):
./gradlew dependencies:update ./gradlew dist distPlatformLibs
Для Gradle вы можете использовать сложные сборки Gradle следующим образом:
# Set with the path of your kotlin-native clone export KONAN_REPO=$PWD/../kotlin-native # Run this once since it is costly, you can remove the `clean` task if not big changes were made from the last time you did this pushd $KONAN_REPO && git pull && ./gradlew clean dependencies:update dist distPlatformLibs && popd # In your project, you set have to the org.jetbrains.kotlin.native.home property, and include as composite the shared and gradle-plugin builds ./gradlew check -Porg.jetbrains.kotlin.native.home=$KONAN_REPO/dist --include-build $KONAN_REPO/shared --include-build $KONAN_REPO/tools/kotlin-native-gradle-plugin
© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/native/faq.html