如何在 Kotlin/Native 中将常量字符* 转换为 KString?

How to convert const char* to KString in Kotlin/Native?

本文关键字:字符 转换 KString 常量 Kotlin Native      更新时间:2023-10-16

在C++文件中,我想将const char*转换为KString,以便我可以使用Kotlin/Native将KString传递给Kotlin文件。

我相信答案就在功能

OBJ_GETTER(utf8ToUtf16, const char* rawString, size_t rawStringLength)

我在KString.cpp中找到的。但是,即使我在 Memory.h 中发现了使用的 define 语句,我还没有设法从我自己的 C++ 文件中正确调用函数utf8ToUtf16来获取 KString。任何帮助,不胜感激。

这取决于您希望如何与 Kotlin 代码交互。如果使用-produce dynamic生成动态库,则字符串会自动转换,请参阅示例 https://github.com/JetBrains/kotlin-native/blob/adf8614889e8cf5038a79960aa9651ca7d45e409/samples/python_extension/src/main/c/kotlin_bridge.c#L72。 所以根本不需要额外的魔法。与 Objective-C 字符串和-produce framework相同。对于其他情况,则不需要传递字符串 C -> Kotlin(使用staticCFunction生成的回调也进行自动转换)。

我最终拿起碎片来编写我自己的函数:

KString getKString(const char* rawString) {
size_t rawStringLength = strlen(rawString);
ObjHeader** OBJ_RESULT;
uint32_t charCount = utf8::unchecked::distance(rawString, rawString + rawStringLength);
ArrayHeader* result = AllocArrayInstance(theStringTypeInfo, charCount, OBJ_RESULT)->array();
KChar* rawResult = CharArrayAddressOfElementAt(result, 0);
auto convertResult =
utf8::unchecked::utf8to16(rawString, rawString + rawStringLength, rawResult);
ObjHeader* obj = result->obj();
UpdateReturnRef(OBJ_RESULT, obj);
return (const ArrayHeader*)obj;
}

在我的测试代码(C++)中,我像这样使用它:

...
RuntimeState* state = InitRuntime();
KString inMessage;
{
ObjHolder args;
inMessage = getKString("Hello from C++");
}
...
DeinitRuntime(state);

并包括 Memory.h、Natives.h、Runtime.h、KString.h、utf8.h、stdlib.h 和字符串。您也许可以摆脱其中的一些。

作为附带说明,您可能会意识到AllocArrayInstance在函数中的使用方式。如果一个人可以简单地做同样的事情来获得 KString,那就太好了,比如:

ObjHeader** OBJ_RESULT;
KString kstr = utf8ToUtf16(rawString, rawStringLength, OBJ_RESULT);

这在我的函数中不起作用,因为找不到 utf8ToUtf16。我相信原因是(在撰写本文时)KString .cpp 中的相应函数位于命名空间 {...} 块内,因此无法从另一个文件中使用它。这就是为什么我最终模仿了如上所示的函数。