Как конвертировать const char * в KString в Kotlin / Native?

В файле C ++ я хочу преобразовать const char * в KString, чтобы затем я мог передать KString в файл Kotlin, используя Котлин / Родной.

Я верю, что ответ лежит в функции

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

что я нашел в KString.cpp. Но даже при том, что я обнаружил используемые операторы define в memory.h, Мне пока не удалось правильно вызвать функцию utf8ToUtf16 из моего собственного файла C ++, чтобы получить KString. Любая помощь приветствуется.

2

Решение

Это зависит от того, как вы хотите взаимодействовать с кодом 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 также делаю автоконверсию).

2

Другие решения

В итоге я взял кусочки, чтобы написать свою собственную функцию:

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 находится внутри блока пространства имен {…}, так что ее нельзя использовать из другого файла. Вот почему я в итоге подражал функции, как показано выше.

0

По вопросам рекламы [email protected]