首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法参考Kotlin多平台项目中的kotlinx.cinterop包

无法参考Kotlin多平台项目中的kotlinx.cinterop包
EN

Stack Overflow用户
提问于 2019-02-19 21:03:28
回答 1查看 1.1K关注 0票数 3

我根据iOS和安卓(https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html)的例子创建了一个Kotlin多平台项目。在我的iOS目标中,我使用cinterop在第三方目标-C框架中链接。这很好用。我能够在'iosMain‘源代码集中引用Kotlin代码中的框架类。但是,其中一个方法调用需要一个NSError**参数。我试图使用以下方法在我的Kotlin代码中创建这个变量:

代码语言:javascript
复制
kotlinx.cinterop.NativePlacement.allocPointerTo<kotlinx.cinterop.ObjCObjectVar<platform.Foundation.NSError?>()

我无法从以下错误中找到答案:

代码语言:javascript
复制
> 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*引用的示例:

代码语言:javascript
复制
memScoped {
    val errorRef = alloc<ObjCObjectVar<NSError?>>()
    someObjCObject.method(errorRef.ptr)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-19 21:47:14

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

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54774871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档