Spec-Zone.ru › Kotlin 2

Файл определения

Kotlin/Native позволяет использовать библиотеки C и Objective-C и применять их функциональность в Kotlin. Специальный инструмент cinterop принимает библиотеку C или Objective-C и создает соответствующие биндинги Kotlin, благодаря чему методы библиотеки можно использовать в коде Kotlin как обычно.

Для создания этих биндингов каждой библиотеке нужен файл определения, обычно с тем же именем, что и у библиотеки. Это файл свойств, в котором точно описано, как следует использовать библиотеку. См. полный список доступных свойств.

Общий порядок работы с проектом:

  1. Создайте файл .def с описанием того, что нужно включить в биндинги.

  2. Используйте сгенерированные биндинги в коде Kotlin.

  3. Запустите компилятор Kotlin/Native, чтобы создать исполняемый файл.

Создание и настройка файла определения

Создадим файл определения и сгенерируем биндинги для библиотеки C:

  1. В IDE выберите папку src и создайте в ней новый каталог с помощью команды Файл | Создать | Каталог.

  2. Назовите новый каталог nativeInterop/cinterop.

    Это соглашение по умолчанию для расположения файлов .def, но его можно переопределить в файле build.gradle.kts, если вы используете другое расположение.

  3. Выберите новую вложенную папку и создайте файл png.def с помощью команды Файл | Создать | Файл.

  4. Добавьте необходимые свойства:

    headers = png.h
    headerFilter = png.h
    package = png
    
    compilerOpts.linux = -I/usr/include -I/usr/include/x86_64-linux-gnu
    linkerOpts.osx = -L/opt/local/lib -L/usr/local/opt/png/lib -lpng
    linkerOpts.linux = -L/usr/lib/x86_64-linux-gnu -lpng
    
    • headers — это список заголовочных файлов, для которых нужно создать заглушки Kotlin. В эту запись можно добавить несколько файлов, разделив их пробелами. В данном случае это только png.h. Указанные файлы должны быть доступны по заданному пути (в данном случае — /usr/include/png).

    • headerFilter указывает, что именно включается. В C также включаются все заголовочные файлы, на которые ссылается другой файл с помощью директивы #include. Иногда это не требуется, и можно использовать этот параметр с шаблонами glob для настройки.

      Используйте headerFilter, если не хотите добавлять внешние зависимости (например, системный заголовочный файл stdint.h) в библиотеку взаимодействия. Кроме того, это может быть полезно для оптимизации размера библиотеки и устранения потенциальных конфликтов между системной средой и предоставляемой средой компиляции Kotlin/Native.

    • Если поведение для определенной платформы нужно изменить, можно использовать формат compilerOpts.osx или compilerOpts.linux, чтобы задать значения параметров для конкретной платформы. В данном случае это macOS (суффикс .osx) и Linux (суффикс .linux). Также можно указать параметры без суффикса (например, linkerOpts=); они будут применяться ко всем платформам.

  5. Чтобы создать биндинги, синхронизируйте файлы Gradle, нажав Синхронизировать сейчас в уведомлении.

    Synchronize the Gradle files

После создания биндингов IDE может использовать их как представление-прокси нативной библиотеки.

Вы также можете настроить создание биндингов с помощью инструмента cinterop в командной строке.

Свойства

Ниже приведен полный список свойств, которые можно использовать в файле определения для настройки содержимого сгенерированных бинарных файлов. Дополнительные сведения см. в соответствующих разделах ниже.

Свойство

Описание

headers

Список заголовочных файлов библиотеки, которые нужно включить в биндинги.

modules

Список модулей Clang из библиотеки Objective-C, которые нужно включить в биндинги.

language

Задает язык. По умолчанию используется C; при необходимости замените его на Objective-C.

compilerOpts

Параметры компилятора, которые инструмент cinterop передает компилятору C.

linkerOpts

Параметры компоновщика, которые инструмент cinterop передает компоновщику.

excludedFunctions

Разделенный пробелами список имен функций, которые нужно игнорировать.

staticLibraries

Экспериментальное. Включает статическую библиотеку в .klib.

libraryPaths

Экспериментальное. Разделенный пробелами список каталогов, в которых инструмент cinterop ищет библиотеку для включения в .klib.

package

Префикс пакета для сгенерированного API Kotlin.

headerFilter

Фильтрует заголовочные файлы по шаблонам glob и включает только соответствующие файлы при импорте библиотеки.

excludeFilter

Исключает определенные заголовочные файлы при импорте библиотеки и имеет приоритет над headerFilter.

strictEnums

Разделенный пробелами список перечислений, которые нужно сгенерировать как перечисления Kotlin.

nonStrictEnums

Разделенный пробелами список перечислений, которые нужно сгенерировать как целочисленные значения.

noStringConversion

Разделенный пробелами список функций, параметры const char* которых не нужно автоматически преобразовывать в String Kotlin.

allowedOverloadsForCFunctions

По умолчанию предполагается, что функции C имеют уникальные имена. Если несколько функций имеют одинаковое имя, выбирается только одна из них. Однако это поведение можно изменить, указав эти функции в allowedOverloadsForCFunctions.

disableDesignatedInitializerChecks

Отключает проверку компилятора, запрещающую вызывать неосновной инициализатор Objective-C как конструктор super().

foreignExceptionMode

Преобразует исключения из кода Objective-C в исключения Kotlin типа ForeignException.

userSetupHint

Добавляет пользовательское сообщение, например помогающее пользователям устранить ошибки компоновщика.

Помимо списка свойств, в файл определения можно добавить пользовательские объявления.

Импорт заголовочных файлов

Если библиотека C не содержит модуля Clang, а состоит из набора заголовочных файлов, используйте свойство headers, чтобы указать заголовочные файлы для импорта:

headers = curl/curl.h

Фильтрация заголовочных файлов по шаблонам glob

Заголовочные файлы можно фильтровать с помощью свойств фильтрации из файла .def. Чтобы включить объявления из заголовочных файлов, используйте свойство headerFilter. Если заголовочный файл соответствует одному из шаблонов glob, его объявления включаются в биндинги.

Шаблоны glob применяются к путям заголовочных файлов относительно соответствующих элементов путей включения, например time.h или curl/curl.h. Поэтому, если библиотека обычно подключается с помощью #include <SomeLibrary/Header.h>, вероятно, заголовочные файлы можно отфильтровать следующим образом:

headerFilter = SomeLibrary/**

Если headerFilter не задано, включаются все заголовочные файлы. Однако рекомендуется использовать headerFilter и задавать как можно более точный шаблон glob. В этом случае сгенерированная библиотека будет содержать только необходимые объявления. Это поможет избежать различных проблем при обновлении Kotlin или инструментов в среде разработки.

Исключение заголовочных файлов

Чтобы исключить определенные заголовочные файлы, используйте свойство excludeFilter. Это может быть полезно для удаления избыточных или проблемных заголовочных файлов и оптимизации компиляции, так как объявления из указанных файлов не включаются в биндинги:

excludeFilter = SomeLibrary/time.h

Если один и тот же заголовочный файл включен с помощью headerFilter и исключен с помощью excludeFilter, он не будет включен в биндинги.

Импорт модулей

Если библиотека Objective-C содержит модуль Clang, используйте свойство modules, чтобы указать модуль для импорта:

modules = UIKit

Задание имени пакета

Используйте свойство package, чтобы задать префикс пакета для сгенерированного API Kotlin:

package = png

Если это свойство не задано, компилятор создает объявления в корневом пакете.

Имена kotlin и kotlinx.cinterop зарезервированы и не могут использоваться в качестве префиксов пакетов.

Передача параметров компилятора и компоновщика

Используйте свойство compilerOpts для передачи параметров компилятору C, который используется для анализа заголовочных файлов. Для передачи параметров компоновщику, который используется для компоновки конечных исполняемых файлов, используйте linkerOpts. Например:

compilerOpts = -DFOO=bar
linkerOpts = -lpng

Также можно указать параметры для конкретной цели, которые применяются только к этой цели:

compilerOpts = -DBAR=bar
compilerOpts.linux_x64 = -DFOO=foo1
compilerOpts.macos_x64 = -DFOO=foo2

В этой конфигурации заголовочные файлы анализируются с помощью -DBAR=bar -DFOO=foo1 в Linux и -DBAR=bar -DFOO=foo2 в macOS. Обратите внимание, что у любого параметра файла определения могут быть общая часть и часть для конкретной платформы.

Игнорирование определенных функций

Используйте свойство excludedFunctions, чтобы указать список имен функций, которые нужно игнорировать. Это может быть полезно, если нет гарантии, что объявленную в заголовочном файле функцию можно вызвать, а определить это автоматически сложно или невозможно. Это свойство также можно использовать для обхода ошибки в самом механизме взаимодействия.

Включение статической библиотеки

Иногда удобнее поставлять статическую библиотеку вместе с продуктом, чем полагаться на то, что она доступна в среде пользователя. Чтобы включить статическую библиотеку в .klib, используйте свойства staticLibrary и libraryPaths:

headers = foo.h
staticLibraries = libfoo.a
libraryPaths = /opt/local/lib /usr/local/opt/curl/lib

При наличии приведенного выше фрагмента инструмент cinterop ищет libfoo.a в /opt/local/lib и /usr/local/opt/curl/lib и, если находит, включает бинарный файл библиотеки в klib.

При использовании в программе klib такого типа библиотека компонуется автоматически.

Настройка генерации перечислений

Используйте свойство strictEnums, чтобы сгенерировать перечисления как перечисления Kotlin, или nonStrictEnums, чтобы сгенерировать их как целочисленные значения. Если перечисление не включено ни в один из этих списков, способ его генерации определяется эвристически.

Настройка преобразования строк

Используйте свойство noStringConversion, чтобы отключить автоматическое преобразование параметров функции const char* в String Kotlin.

Разрешение вызова неосновного инициализатора

По умолчанию компилятор Kotlin/Native запрещает вызывать неосновной инициализатор Objective-C как конструктор super(). Такое поведение может быть неудобным, если в библиотеке неправильно помечены основные инициализаторы Objective-C. Чтобы отключить эти проверки компилятора, используйте свойство disableDesignatedInitializerChecks.

Обработка исключений Objective-C

По умолчанию программа аварийно завершается, если исключения Objective-C пересекают границу взаимодействия Objective-C и Kotlin и попадают в код Kotlin.

Чтобы передавать исключения Objective-C в Kotlin, включите их оборачивание с помощью свойства foreignExceptionMode = objc-wrap. В этом случае исключения Objective-C преобразуются в исключения Kotlin типа ForeignException.

Помощь в устранении ошибок компоновщика

Ошибки компоновщика могут возникать, если библиотека Kotlin зависит от библиотек C или Objective-C, например при использовании интеграции CocoaPods. Если зависимые библиотеки не установлены локально на компьютере или явно не настроены в сценарии сборки проекта, возникает ошибка «Framework not found».

Если вы автор библиотеки, вы можете помочь пользователям устранить ошибки компоновщика с помощью пользовательских сообщений. Для этого добавьте свойство userSetupHint=message в файл .def или передайте параметр компилятора -Xuser-setup-hint в cinterop.

Добавление пользовательских объявлений

Иногда перед созданием биндингов в библиотеку необходимо добавить пользовательские объявления C (например, для макросов). Вместо создания дополнительного заголовочного файла с этими объявлениями можно добавить их непосредственно в конец файла .def после разделительной строки, содержащей только последовательность-разделитель ---:

headers = errno.h
---

static inline int getErrno() {
    return errno;
}

Обратите внимание, что эта часть файла .def обрабатывается как часть заголовочного файла, поэтому функции с телом следует объявлять как static. Объявления анализируются после включения файлов из списка headers.

Создание биндингов с помощью командной строки

Помимо файла определения, можно указать, что включить в биндинги, передав соответствующие свойства в качестве параметров вызова cinterop.

Ниже приведен пример команды, которая создает скомпилированную библиотеку png.klib:

cinterop -def png.def -compiler-option -I/usr/local/include -o png

Обратите внимание, что сгенерированные биндинги обычно зависят от платформы, поэтому при разработке для нескольких целей их необходимо создавать заново.

  • Для системных библиотек, не включенных в пути поиска sysroot, могут потребоваться заголовочные файлы.

  • Для типичной библиотеки UNIX со сценарием конфигурации свойство compilerOpts, скорее всего, будет содержать вывод сценария конфигурации с параметром --cflags (возможно, без точных путей).

  • Вывод сценария конфигурации с параметром --libs можно передать свойству linkerOpts.

Что дальше

  • Биндинги для взаимодействия с C

  • Взаимодействие со Swift и Objective-C

26 августа 2026 г.
Создание приложения с использованием взаимодействия с C и libcurl — руководствоИмпорт библиотек C, Objective-C и Swift

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-definition-file.html

Spec-Zone.ru

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