Я пытаюсь использовать 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))
}
Это работает, но выглядит не очень хорошо. Может быть, кто-то может предложить лучший способ?