私は自分の関数を書くために断片を取りました:
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 のそれぞれの関数が名前空間 {...} ブロック内にあり、別のファイルから使用できないためだと思います。そのため、上記のように機能を模倣することになりました。