Spec-Zone.ru › Kotlin 1.7

Kotlin/Native ЧаВо

Как запустить мою программу?

Определите функцию верхнего уровня fun main(args: Array<String>) или просто fun main(), если вас не интересуют переданные аргументы, убедитесь, что она не находится в пакете. Также можно использовать компиляторную опцию -entry, чтобы сделать любую функцию, принимающую Array<String> или не принимающую аргументов, и возвращающую Unit, точкой входа.

Какая модель управления памятью используется в Kotlin/Native?

Kotlin/Native использует автоматическую схему управления памятью, похожую на Java или Swift.

Узнайте о менеджере памяти Kotlin/Native

Как создать общую библиотеку?

Используйте компиляторную опцию -produce dynamic или binaries.sharedLib() в Gradle.

kotlin {
    iosArm64("mylib") {
        binaries.sharedLib()
    }
}

Это создаст платформоспецифичный общий объект (.so на Linux, .dylib на macOS и .dll на Windows) и заголовок на языке C, позволяющий использовать все доступные публичные API вашей программы Kotlin/Native из кода C/C++.

Как создать статическую библиотеку или файл объекта?

Используйте компиляторную опцию -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 или соответствующее утверждение 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 фреймворка?

По умолчанию плагин 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, чтобы узнать о новом менеджере памяти, который включён по умолчанию начиная с Kotlin 1.7.20.

Вероятно, это происходит, потому что вы пытаетесь изменить замороженный объект. Объект может перейти в замороженное состояние явным образом, как объекты, доступные из объектов, к которым применяется kotlin.native.concurrent.freeze, или неявно (т. е. доступные из enum или глобального объекта-синглтона — см. следующий вопрос).

Как сделать объект-синглтон изменяемым?

Эта проблема актуальна только для старого менеджера памяти. Обратитесь к управлению памятью в Kotlin/Native, чтобы узнать о новом менеджере памяти, который включён по умолчанию начиная с Kotlin 1.7.20.

В настоящее время объекты-синглтоны неизменяемы (т. е. замораживаются после создания), и, как правило, считается хорошей практикой, чтобы глобальное состояние было неизменяемым. Если по какой-то причине вам нужен изменяемый объект внутри такого объекта, используйте аннотацию @konan.ThreadLocal на объекте. Также можно использовать класс kotlin.native.concurrent.AtomicReference, чтобы хранить разные указатели на замороженные объекты в замороженном объекте и автоматически обновлять их.

Как скомпилировать проект с предварительными версиями Kotlin/Native?

Сначала попробуйте предварительные версии.

В случае необходимости более свежей версии, вы можете скомпилировать Kotlin/Native из исходного кода: склонируйте репозиторий Kotlin и следуйте эти шагам.

Последнее изменение: 22 сентября 2022
Советы по улучшению времени компиляции 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API