Передача указателя на строку без знака на привязки, сгенерированные kotlin cinterop - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь использовать C-библиотеку с родным Kotlin C-interop, и мне нужно передать в C-функцию некоторую строку. C-функция имеет подпись (опуская детали):

typedef unsigned char GByte;

void someFunFromC(GByte* data); 

Те же функции из Kotlin можно вызвать как:

someFunctionFromC(data: kotlinx.cinterop.CValuesRef<libmylib.GByteVar /* = kotlinx.cinterop.UByteVarOf<libmylib.GByte /* = kotlin.UByte */> */>?)

Итак, как описано в документации Kotlin (https://kotlinlang.org/docs/tutorials/native/mapping-strings-from-c.html) Я пытался использовать это следующим образом:

val kotlinString = "this is a Kotlin String"
someFunctionFromC(kotlinString.cstr)

и получите:

Required : CValuesRef<GByteVar /* = UByteVarOf<GByte /* = UByte */> */>?
Found : CValues<ByteVar /* = ByteVarOf<Byte  /*>

Это произошло потому, что мне нужно передать C-функцию, а не char* cstring , но unsigned char* cstring

Решение, которое я нашел, чтобы решить его:

kotlinString.toUtf8().toUByteArray().usePinned { kString ->
    someFunctionFromC(kString.adressOf(0))
}

Это работает, но выглядит не очень хорошо. Может быть, кто-то может предложить лучший способ?

1 Ответ

0 голосов
/ 17 июня 2019

Вы можете попробовать использовать kotlinString.cstr as? CValuesRef<GByteVar>.

...