c - 将指向无符号字符串的指针传递给由 kotlin cinterop 生成的绑定



我正在尝试将 C 库与 Kotlin 原生的 C 互操作一起使用,我需要将一些字符串传递给 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* cstringunsigned char* cstring

我找到的解决方案可以解决它:

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

它有效,但看起来不太好。也许有人可以提出更好的方法?

您可以尝试使用 kotlinString.cstr as? CValuesRef<GByteVar> .

最新更新