我正在使用 kotlin-native,并且必须将指向 struc 的指针传递给 C 函数。我的"Kotlin Stub"具有有趣的SET_SM_REFS_INDEX(索引:Int,thisObject:CValuesRef?(的签名。
在本机端,代码想要保存指向"thisObject"的指针,并希望在另一个线程中更新结构中的字段。例如,让我们将该字段称为整数"thisObject->myUpdate"。
现在我尝试使用 var AA = cValue<.. 创建一个对象。>并尝试将函数调用为 SET_SM_REFS_INDEX(0, AA(. 没有编译错误。 但是我注意到我的字段"AA.update"永远不会更新,并且始终保持在 0。
阅读文档 https://kotlinlang.org/docs/tutorials/native/mapping-struct-union-types-from-c.html 它说了一些关于使用 kotlinx.cinterop.NativePlacement"的内容,但没有详细说明。
我可以看到cValue可能是错误的东西,因为它具有byValue语义。
有人知道怎么做吗?
好的,我想我找到了答案。 对于我的例子:
而不是有
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,您不必显式释放内存。
希望这对某人有所帮助