无法在 Kotlin Multiplatform 项目中引用 kotlinx.cinterop 包
Unable to reference kotlinx.cinterop package in Kotlin Multiplatform project
我根据 iOS 和 Android (https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html) 的示例创建了一个 Kotlin Multiplatform 项目。在我的 iOS 目标中,我在第 3 方 Objective-C 框架中使用 cinterop 来 link。这工作正常。我可以在 '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 的一部分,应该自动添加为依赖项。我是不是在某处遗漏了一个等式?
更新
以下是从 Kotlin 传递 NSError* 引用的示例:
memScoped {
val errorRef = alloc<ObjCObjectVar<NSError?>>()
someObjCObject.method(errorRef.ptr)
}
kotlinx.cinterop.NativePlacement
是接口名称,而不是 class 名称。您需要 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
我根据 iOS 和 Android (https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html) 的示例创建了一个 Kotlin Multiplatform 项目。在我的 iOS 目标中,我在第 3 方 Objective-C 框架中使用 cinterop 来 link。这工作正常。我可以在 '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 的一部分,应该自动添加为依赖项。我是不是在某处遗漏了一个等式?
更新
以下是从 Kotlin 传递 NSError* 引用的示例:
memScoped {
val errorRef = alloc<ObjCObjectVar<NSError?>>()
someObjCObject.method(errorRef.ptr)
}
kotlinx.cinterop.NativePlacement
是接口名称,而不是 class 名称。您需要 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