Kotlin-native cinterop从C更新Struc字段

时间:2019-10-11 12:18:27

标签: kotlin kotlin-native

我正在使用kotlin-native,必须将指向struc的指针传递给C函数。我的“ Kotlin存根”具有有趣的签名SET_SM_REFS_INDEX(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语义。

有人知道该怎么做吗?

1 个答案:

答案 0 :(得分:0)

好的,我想我找到了答案。对于我的示例:

而不是拥有

var AA = cValue <..>

一个需要

var AA = nativeHeap.alloc <..>()

其中“ ..”是Klib存根中的C结构类型。那么呼叫将会是

SET_SM_REFS_INDEX(0,AA.ptr)

注意“ .ptr”,并记住在该行的下方以显式释放内存

nativeHeap.free(AA)

我必须使用nativeHeap,因为我在一个范围很广的范围内使用了C结构,有点像“全球化”。还有另一种方法可以对memScope {}使用更多的“本地”分配,而对于memScope,则不必大意释放内存。

希望这对某人有帮助