2017-12-05 11 views
1

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

私は答えは、私がKString.cppで見つかった機能

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

にあると考えています。しかし、私はMemory.hで使用された定義ステートメントを発見しましたが、まだ私の独自のC++ファイルから関数utf8ToUtf16を適切に呼び出すことはできませんでした。どんな助けもありがとうございます。

答えて

0

私は私自身の機能の書き込みに駒を取ってしまった:私のテストコード(C++)で

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; 
} 

を、私はこのようにそれを使用します。

... 
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が関数でどのように使用されているかがわかります。 1は、単にKString、のようなものを取得するために同じことを行うことができれば、いいだろう:

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

utf8ToUtf16が見つかりませんでしたので、これは、私の機能から動作しませんでした。理由は、KString.cpp内のそれぞれの関数が別のファイルから使用できないような名前空間{...}ブロック内にあることです(記述時に)。だからこそ私は上記のような機能を模倣した。

0

どのように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で生成されたコールバックもまた自動変換を行います)を渡す必要はありません。