我最终把这些碎片写成了我自己的函数:
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 和 string。您也许可以摆脱其中的一些。
作为旁注,您可能会意识到 AllocArrayInstance 是如何在函数中使用的。如果一个人可以简单地为获取 KString 做同样的事情,那就太好了,比如:
ObjHeader** OBJ_RESULT;
KString kstr = utf8ToUtf16(rawString, rawStringLength, OBJ_RESULT);
这在我的函数中不起作用,因为未找到 utf8ToUtf16。我相信原因是,(在撰写本文时) KString.cpp 中的相应函数位于命名空间 {...} 块内,因此无法从另一个文件中使用它。这就是为什么我最终模仿了如上所示的功能。