Kotlin-Native cinterop Обновление поля Struc из C - PullRequest
0 голосов
/ 11 октября 2019

Я использую kotlin-native и должен передать указатель на структуру функции 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 голосов
/ 11 октября 2019

Хорошо, я думаю, что нашел ответ. Для моего примера:

Вместо

var AA = cValue <..>

нужно

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

где ".." - это тип структуры C из вашей заглушки Klib. тогда вызов будет

SET_SM_REFS_INDEX (0, AA.ptr)

запишите ".ptr" и не забудьте где-нибудь внизу строки явно освободить память

nativeHeap.free (AA)

Я должен использовать nativeHeap, потому что я использую структуру C в области видимости, которая является «глобальной». Есть еще один способ использовать alloc больше «локально» с memScope {}, а с memScope вы не можете явно освободить память.

Надеюсь, это кому-нибудь поможет

...