如何在 Kotlin/Native 中将常量字符* 转换为 KString?
How to convert const char* to KString in Kotlin/Native?
在C++文件中,我想将const char*转换为KString,以便我可以使用Kotlin/Native将KString传递给Kotlin文件。
我相信答案就在功能
OBJ_GETTER(utf8ToUtf16, const char* rawString, size_t rawStringLength)
我在KString.cpp中找到的。但是,即使我在 Memory.h 中发现了使用的 define 语句,我还没有设法从我自己的 C++ 文件中正确调用函数utf8ToUtf16
来获取 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 中的相应函数位于命名空间 {...} 块内,因此无法从另一个文件中使用它。这就是为什么我最终模仿了如上所示的函数。
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 字符转换功能 std::isupper() & std::islower() C++17
- 将字符 * 转换为字符串 *
- 在编译时将常量字符* 转换为常量 char_type*
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 无法使用字符串流将字符转换为字符串C++
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法<string>从"常量字符 []"转换为<类名>
- 不能将字符转换为整数吗?
- 编译时将字符*转换为字节
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 将单个字符转换为 std::string 前缀 \x01
- PPM 将字符转换为 int 授予负数
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 将常量字符* 转换为字符时出错