Как использовать cinterop в мультиплатформенных мобильных проектах Kotlin

#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 работает нормально.