我正在使用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语义。
有人知道该怎么做吗?
答案 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,则不必大意释放内存。
希望这对某人有帮助