将指向无符号字符串的指针传递给 kotlin cinterop 生成的绑定
Passing pointer to unsigned string to bindings generated by 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* cstring
, 但
unsigned char* cstring
我找到的解决方法:
kotlinString.toUtf8().toUByteArray().usePinned { kString ->
someFunctionFromC(kString.adressOf(0))
}
有效,但效果不佳。也许有人可以提出更好的方法?
您可以尝试使用kotlinString.cstr as? CValuesRef<GByteVar>
。
我正在尝试将 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))
}
有效,但效果不佳。也许有人可以提出更好的方法?
您可以尝试使用kotlinString.cstr as? CValuesRef<GByteVar>
。