无法在 Kotlin Multiplatform 项目中引用 kotlinx.cinterop 包

Posted

技术标签:

【中文标题】无法在 Kotlin Multiplatform 项目中引用 kotlinx.cinterop 包【英文标题】:Unable to reference kotlinx.cinterop package in Kotlin Multiplatform project 【发布时间】:2019-07-13 11:10:50 【问题描述】:

我基于 iosandroid (https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html) 示例创建了一个 Kotlin 多平台项目。在我的 iOS 目标中,我使用 cinterop 链接到第 3 方 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的一部分,应该自动添加为依赖项。我是否在某处遗漏了方程式?

更新

以下是从 Kotlin 传递 NSError* 引用的示例:

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.. 接受一个 lambda,在 lambda 内部,接收者实现了 NativePlacement 类型,因此不需要限定符来调用它的函数

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

【讨论】:

我什至没有注意到它是一个界面。谢谢! Android Studio 编辑器在这里也没有帮助。它似乎无法识别任何类型或导入。

以上是关于无法在 Kotlin Multiplatform 项目中引用 kotlinx.cinterop 包的主要内容,如果未能解决你的问题,请参考以下文章

无法在 MacBook M1 芯片上构建 Kotlin Multiplatform 移动项目

无法解析 Kotlin Multiplatform 中的 cinterop IOS 导入

如何在 kotlin Multiplatform 和 Swift 中使用默认接口实现

Kotlin Multiplatform 中 iOS 应用程序的不同架构

在 Kotlin MultiPlatform 项目中未解决 iOS 依赖项

如何在 Kotlin/Multiplatform 项目中使用 .klib 库