我正在使用kotlin-native,并且必须将一个指向struc的指针传递给一个C函数。我的"Kotlin Stub“有fun SET_SM_REFS_INDEX(索引: Int,thisObject: CValuesRef?)的签名。
在本机方面,代码希望持有指向“thisObject”的指针,并希望更新结构中的字段,可能是在另一个线程中。例如,让我们将该字段称为整数"thisObject->myUpdate“。
现在,我尝试使用var AA = cValue<..>创建一个对象,并尝试将函数调用为SET_SM_REFS_INDEX(0,AA)。没有编译错误。然而,我注意到我的字段"AA.update“从不更新,总是保持为0。
阅读documentation https://kotlinlang.org/docs/tutorials/native/mapping-struct-union-types-from-c.html,它说明了一些关于使用kotlinx.cinterop.NativePlacement的事情“,但并没有深入到细节。
我可以看出,传递cValue可能是错误的,因为它具有byValue语义。
有人知道怎么做吗?
发布于 2019-10-12 01:08:12
好了,我想我找到答案了。在我的例子中:
而不是让
var AA = cValue<..>
一个人需要
var AA = nativeHeap.alloc<..>()
其中"..“是来自Klib存根的C结构类型。那么调用将是
SET_SM_REFS_INDEX(0,AA.ptr)
注意".ptr“,并记住在行的某处显式地释放内存
nativeHeap.free(AA)
我不得不使用nativeHeap,因为我在一个范围内使用了C结构,有点“全球化”。在memScope{}中,还有另一种更“本地”地使用alloc的方法,使用memScope时,您不需要显式地释放内存。
希望这能帮助到某人
https://stackoverflow.com/questions/58341123
复制相似问题