Файл определения
Kotlin/Native позволяет использовать библиотеки C и Objective-C и применять их функциональность в Kotlin. Специальный инструмент cinterop принимает библиотеку C или Objective-C и создает соответствующие биндинги Kotlin, благодаря чему методы библиотеки можно использовать в коде Kotlin как обычно.
Для создания этих биндингов каждой библиотеке нужен файл определения, обычно с тем же именем, что и у библиотеки. Это файл свойств, в котором точно описано, как следует использовать библиотеку. См. полный список доступных свойств.
Общий порядок работы с проектом:
Создайте файл
.defс описанием того, что нужно включить в биндинги.Используйте сгенерированные биндинги в коде Kotlin.
Запустите компилятор Kotlin/Native, чтобы создать исполняемый файл.
Создание и настройка файла определения
Создадим файл определения и сгенерируем биндинги для библиотеки C:
В IDE выберите папку
srcи создайте в ней новый каталог с помощью команды Файл | Создать | Каталог.-
Назовите новый каталог
nativeInterop/cinterop.Это соглашение по умолчанию для расположения файлов
.def, но его можно переопределить в файлеbuild.gradle.kts, если вы используете другое расположение. Выберите новую вложенную папку и создайте файл
png.defс помощью команды Файл | Создать | Файл.-
Добавьте необходимые свойства:
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=); они будут применяться ко всем платформам.
-
Чтобы создать биндинги, синхронизируйте файлы Gradle, нажав Синхронизировать сейчас в уведомлении.
После создания биндингов IDE может использовать их как представление-прокси нативной библиотеки.
Свойства
Ниже приведен полный список свойств, которые можно использовать в файле определения для настройки содержимого сгенерированных бинарных файлов. Дополнительные сведения см. в соответствующих разделах ниже.
Свойство |
Описание |
|---|---|
Список заголовочных файлов библиотеки, которые нужно включить в биндинги. |
|
Список модулей Clang из библиотеки Objective-C, которые нужно включить в биндинги. |
|
|
Задает язык. По умолчанию используется C; при необходимости замените его на |
Параметры компилятора, которые инструмент cinterop передает компилятору C. |
|
Параметры компоновщика, которые инструмент cinterop передает компоновщику. |
|
Разделенный пробелами список имен функций, которые нужно игнорировать. |
|
Экспериментальное. Включает статическую библиотеку в |
|
Экспериментальное. Разделенный пробелами список каталогов, в которых инструмент cinterop ищет библиотеку для включения в |
|
Префикс пакета для сгенерированного API Kotlin. |
|
Фильтрует заголовочные файлы по шаблонам glob и включает только соответствующие файлы при импорте библиотеки. |
|
Исключает определенные заголовочные файлы при импорте библиотеки и имеет приоритет над |
|
Разделенный пробелами список перечислений, которые нужно сгенерировать как перечисления Kotlin. |
|
Разделенный пробелами список перечислений, которые нужно сгенерировать как целочисленные значения. |
|
Разделенный пробелами список функций, параметры |
|
|
По умолчанию предполагается, что функции C имеют уникальные имена. Если несколько функций имеют одинаковое имя, выбирается только одна из них. Однако это поведение можно изменить, указав эти функции в |
Отключает проверку компилятора, запрещающую вызывать неосновной инициализатор Objective-C как конструктор |
|
Преобразует исключения из кода Objective-C в исключения Kotlin типа |
|
Добавляет пользовательское сообщение, например помогающее пользователям устранить ошибки компоновщика. |
Помимо списка свойств, в файл определения можно добавить пользовательские объявления.
Импорт заголовочных файлов
Если библиотека 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
Импорт модулей
Если библиотека Objective-C содержит модуль Clang, используйте свойство modules, чтобы указать модуль для импорта:
modules = UIKit
Задание имени пакета
Используйте свойство package, чтобы задать префикс пакета для сгенерированного API Kotlin:
package = png
Если это свойство не задано, компилятор создает объявления в корневом пакете.
Передача параметров компилятора и компоновщика
Используйте свойство 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.
Что дальше
© 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