Проблема с использованием c-взаимодействия Kotlin для Avro C

#c #kotlin #pointers #avro #kotlin-native

Вопрос:

Мы создаем мультиплатформенное приложение kotlin с использованием Avro. Avro java используется для Android, и планируется использовать Avro C для iOS. У нас есть Avro C, интегрированный в приложение kotlin, но у нас возникли проблемы с функциями c-взаимодействия. Я думаю, что это как-то связано с тем, как мы передаем наши исходящие переменные (ссылки).

Код Котлина:

 var json: String =
                "{"
                "  "type": "record","
                "  "name": "list","
                "  "fields": ["
                "    { "name": "x", "type": "int" },"
                "    { "name": "y", "type": "int" },"
                "    { "name": "next", "type": ["null","list"]}"
                "  ]"
                "}";

var avro_c_schema: avro_schema_t? = null
var error: avro_schema_error_t? = null

var resultInt = avro_schema_from_json(json, json.length, cValuesOf(avro_c_schema), cValuesOf(error))
 

Функция c возвращает 0, что означает, что ошибок не было, но ссылочные переменные avro_c_schema и error равны нулю. Я предполагаю, что это как-то связано с взаимодействием, возможно, мы не передаем их неправильно.

Вот avro_schema_from_json_t исходный код функции.

А это документация Avro C.

Ответ №1:

Из cValuesOf документации:

Возвращает последовательность неизменяемых значений CValues для передачи их в код C.

Поэтому я не думаю, что это правильный метод в вашем случае. Попробуйте это вместо этого:

 memScoped {
    val avro_c_schema = alloc<avro_schema_t>()
    val error = alloc<avro_schema_error_t>()

    var resultInt = avro_schema_from_json(json, json.length, avro_c_schema.ptr, error.ptr)
}