Невозможно сослаться на пакет kotlinx.cinterop в проекте Kotlin Multiplatform
Я создал проект Kotlin Multiplatform на основе примера для iOS и Android ( https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html). В моей цели iOS я использую cinterop для связи в сторонней платформе Objective-C. Это работает нормально. Я могу ссылаться на классы фреймворка в своем коде 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 ответ
kotlinx.cinterop.NativePlacement
это имя интерфейса, а не имя класса. Вам нужен экземпляр NativePlacement
интерфейс для работы. Например memscoped{..}
блок будет работать, например
import kotlinx.cinterop.*
import platform.Foundation.*
val p = memScoped {
allocPointerTo<ObjCObjectVar<NSError?>>()
}
memscoped{..}
принимает лямбда, внутри лямбда получатель реализует NativePlacement
тип, поэтому нет необходимости для спецификатора для вызова функции на нем