我基于iOS和Android(https://kotlinlang.org/docs/tutorials/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的一部分,应自动将其添加为依赖项。我在某处缺少方程式吗?
更新
以下是从Kotlin传递NSError *引用的示例:
memScoped {
val errorRef = alloc<ObjCObjectVar<NSError?>>()
someObjCObject.method(errorRef.ptr)
}
答案 0 :(得分: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