2

我正在尝试将 C-library 与 Kotlin-native C-interop 一起使用,我需要将一些字符串传递给 C-function。C-function 有签名(省略细节):

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-function not char* cstring ,但是 unsigned char* cstring

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

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

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

4

1 回答 1

1

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

于 2019-06-17T12:36:41.517 回答