2

C++ ファイルでは、const char* を KString に変換して、Kotlin/Nativeを使用して KString を Kotlin ファイルに渡すことができるようにします。

答えは機能にあると思います

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

KString.cppで見つけました。しかし、 Memory.h で使用されている define ステートメントを発見したにもかかわらずutf8ToUtf16自分の C++ ファイルから関数を適切に呼び出して KString を取得することはまだできていません。どんな助けでも大歓迎です。

4

2 に答える 2

0

私は自分の関数を書くために断片を取りました:

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

于 2017-12-07T10:33:36.243 に答える