首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将指向无符号字符串的指针传递给kotlin cinterop生成的绑定

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

Stack Overflow用户
提问于 2019-06-17 17:34:26
回答 1查看 319关注 0票数 2

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

代码语言:javascript
复制
typedef unsigned char GByte;

void someFunFromC(GByte* data); 

可以像这样调用Kotlin中的相同函数:

代码语言:javascript
复制
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)中我尝试这样使用它:

代码语言:javascript
复制
val kotlinString = "this is a Kotlin String"
someFunctionFromC(kotlinString.cstr)

并获取:

代码语言:javascript
复制
Required : CValuesRef<GByteVar /* = UByteVarOf<GByte /* = UByte */> */>?
Found : CValues<ByteVar /* = ByteVarOf<Byte  /*>

这是因为我需要传入C函数而不是char* cstring,而是unsigned char* cstring

我找到的解决方案:

代码语言:javascript
复制
kotlinString.toUtf8().toUByteArray().usePinned { kString ->
    someFunctionFromC(kString.adressOf(0))
}

它起作用了,但看起来不太好。也许有人可以建议一个更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-17 20:36:42

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56628565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档