将指向无符号字符串的指针传递给Kotlin Cinterop生成的绑定

时间:2019-06-17 09:34:26

标签: c kotlin kotlin-native

我正在尝试将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* cstring ,但是 unsigned char* cstring

我发现可以解决的解决方案:

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

它可以正常工作,但外观不太好。也许有人可以提出更好的方法?

1 个答案:

答案 0 :(得分:0)

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