#kotlin #kotlin-multiplatform #kotlin-native #kotlin-multiplatform-mobile #cinterop
#kotlin #kotlin-мультиплатформенный #kotlin-native #kotlin-мультиплатформенный-мобильный #cinterop
Вопрос:
Я хочу интегрировать код C в мультиплатформенный мобильный проект Kotlin с помощью этого cinterop
инструмента. Я уже потратил некоторое время на документацию по Kotlin Multiplatform и Kotlin / Native, но, похоже, я не могу заставить ее работать.
Вот мой build.gradle.kts
:
kotlin {
android {
publishLibraryVariants("release", "debug")
publishLibraryVariantsGroupedByFlavor = true
}
ios()
androidNativeArm32 {
compilations.getByName("main") {
val myInterop by cinterops.creating {
defFile(project.file("foobar.def"))
packageName("org.sample")
}
}
}
...
}
Я хочу сделать то же самое для родной части iOS.
Наблюдая за выводом gradle, мне кажется, что конфигурация cinterop полностью игнорируется. Не имеет значения def
, существует файл или нет. Это не имеет значения.
Извините, если я пропустил здесь очевидное. Я немного смущен всеми различными расширениями Kotlin и особенно тем, как они должны работать вместе.
Чего мне не хватает в моей конфигурации? Возможно ли вообще использовать cinterop в проекте KMM.
Комментарии:
1. Пожалуйста, обратите внимание, что
android
иandroidNativeArm32
являются разными целями. Если вы хотите использовать собственные двоичные файлы, созданные дляandroidNativeArm32
вашейandroid
цели, вам придется настроить это вручную с помощью поддержки Android NDK.2. Спасибо @hotkey. Хороший момент. Интересно, имеет ли смысл
cinterop
вообще использовать в этом случае. Почему бы тогда не использовать NDK / CMake напрямую?3. Вам нужно
cinterop
, только если вы хотите написать код Kotlin / Native, который ссылается на собственные библиотеки. В вашем случае, если вы хотите ввести некоторые оболочки вокруг собственной библиотеки и использовать Kotlin для этого, тогда вам нужно использоватьcinterop
, но вы, скорее всего, захотите сделать это в другом подпроекте, отличном от вашегоandroid
целевого, потому что в одном проекте весь общий код будет скомпилирован для обоихandroid
иandroidNativeArm32
. Если вам нужно только вызвать собственную библиотеку из кода Android, тогда вам не нужноcinterop
, и NDK — ваш лучший выбор.4. На самом деле, мне нужно вызвать собственный код из кода iOS и Android. Я попытался переместить
compilations...
часть вandroid
разделе, но затем он жалуетсяcinterop
на то, что он недоступен. Я искал примеры, которые делают это, но не смог найти ни одного. Я также обнаружил, что документация не очень полезна, или я пропустил некоторые сведения. Возможно. Не могли бы вы указать мне на пример проекта?5. Я все еще не могу заставить cinterop работать на Android. Мой текущий обходной путь для Android заключается в использовании привязок JNI с Android NDK. Для iOS cinterop работает нормально.