Kotlin-Native cinterop 从 C 更新 Struc 字段



我正在使用 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,您不必显式释放内存。

希望这对某人有所帮助

最新更新