Невозможно сослаться на пакет kotlinx.cinterop в проекте Kotlin Multiplatform - PullRequest
0 голосов
/ 20 февраля 2019

Я создал проект Kotlin Multiplatform на основе примера для iOS и Android (https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html).) В моей цели iOS я использую cinterop для связи в сторонней платформе Objective-C. Это работает нормально. IЯ могу ссылаться на классы каркаса в моем коде Kotlin в исходном наборе 'iosMain'. Однако для одного из вызовов метода требуется параметр NSError **. Я пытаюсь использовать следующее для создания этой переменной в моем коде Kotlin:

kotlinx.cinterop.NativePlacement.allocPointerTo<kotlinx.cinterop.ObjCObjectVar<platform.Foundation.NSError?>()

Мне не удалось отыскать следующие ошибки:

> Task :sharedLib:linkMainDebugFrameworkIOS FAILED
src/iosMain/kotlin/Platform.kt:9:50: error: unresolved reference: allocPointerTo
    val error = kotlinx.cinterop.NativePlacement.allocPointerTo<kotlinx.cinterop.ObjCObjectVar<platform.Foundation.NSError?>()
                                                 ^
src/iosMain/kotlin/Platform.kt:9:126: error: no value passed for parameter 'rawPtr'
    val error = kotlinx.cinterop.NativePlacement.allocPointerTo<kotlinx.cinterop.ObjCObjectVar<platform.Foundation.NSError?>()

Насколько я понимаю, этот пакет является частью stdlib, который должен быть автоматически добавлен в качестве зависимости.Я где-то пропускаю часть уравнения?

ОБНОВЛЕНИЕ

Ниже приведен пример передачи ссылки NSError * от Kotlin:

memScoped {
    val errorRef = alloc<ObjCObjectVar<NSError?>>()
    someObjCObject.method(errorRef.ptr)
}

1 Ответ

0 голосов
/ 20 февраля 2019

kotlinx.cinterop.NativePlacement - это имя интерфейса, а не имя класса.Вам нужен экземпляр интерфейса NativePlacement для работы.Например, блок memscoped{..} будет работать, например,

import kotlinx.cinterop.*
import platform.Foundation.*

val p = memScoped {    
  allocPointerTo<ObjCObjectVar<NSError?>>()
}

. memscoped{..} принимает лямбду, внутри лямбды получатель реализует тип NativePlacement, поэтому нет необходимости в квалификаторе для вызовафункция на нем

https://kotlinlang.org/docs/reference/lambdas.html#function-literals-with-receiver

...