В файле C ++ я хочу преобразовать const char * в KString, чтобы затем я мог передать KString в файл Kotlin, используя Котлин / Родной.
Я верю, что ответ лежит в функции
OBJ_GETTER(utf8ToUtf16, const char* rawString, size_t rawStringLength)
что я нашел в KString.cpp. Но даже при том, что я обнаружил используемые операторы define в memory.h, Мне пока не удалось правильно вызвать функцию utf8ToUtf16
из моего собственного файла C ++, чтобы получить KString. Любая помощь приветствуется.
Это зависит от того, как вы хотите взаимодействовать с кодом 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
также делаю автоконверсию).
В итоге я взял кусочки, чтобы написать свою собственную функцию:
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 находится внутри блока пространства имен {…}, так что ее нельзя использовать из другого файла. Вот почему я в итоге подражал функции, как показано выше.