2

在 C++ 文件中,我想将 const char* 转换为 KString,然后我可以使用Kotlin/Native将 KString 传递给 Kotlin 文件。

我相信答案在于功能

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

我在KString.cpp中找到的。但是即使我在Memory.h中发现了使用的定义语句,我还没有设法utf8ToUtf16从我自己的 C++ 文件中正确调用该函数来获取 KString。任何帮助表示赞赏。

4

2 回答 2

3

这取决于您希望如何与 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也会自动转换)。

于 2018-02-21T08:36:09.527 回答
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 和 string。您也许可以摆脱其中的一些。

作为旁注,您可能会意识到 AllocArrayInstance 是如何在函数中使用的。如果一个人可以简单地为获取 KString 做同样的事情,那就太好了,比如:

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

这在我的函数中不起作用,因为未找到 utf8ToUtf16。我相信原因是,(在撰写本文时) KString.cpp 中的相应函数位于命名空间 {...} 块内,因此无法从另一个文件中使用它。这就是为什么我最终模仿了如上所示的功能。

于 2017-12-07T10:33:36.243 回答