无法在Kotlin Multiplatform项目中引用Kotlinx.cinterop软件包



我基于iOS和android的示例(https://kotlinlang.org/docs/tutorials/native/native/mpp-ios-android.html)创建了一个Kotlin Multiplatform项目。在我的iOS目标中,我使用Cinterop在第三方Objective-C框架中链接。这很好。我能够在" iOSMAIN"源集中的Kotlin代码中引用框架类。但是,其中一个方法调用需要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的一部分,该软件包应自动添加为依赖关系。我是否在某个地方错过了一个方程式?

update

以下是从kotlin传递nserror*参考的示例:

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

kotlinx.cinterop.NativePlacement是接口名称,而不是类名。您需要NativePlacement接口的实例才能工作。例如memscoped{..}块将起作用,例如

import kotlinx.cinterop.*
import platform.Foundation.*
val p = memScoped {    
  allocPointerTo<ObjCObjectVar<NSError?>>()
}

memscoped{..}接受lambda,在lambda内部,接收器实现了NativePlacement类型,因此无需预选器在其上调用功能

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

最新更新