Xamarin Android: как правильно маршалировать строку из C # в строку Unicode в C ++?

Я пишу приложение для Android Xamarin и пытаюсь также написать собственную библиотеку C ++, в которую приложение Xamarin должно передавать данные. Мне нужно передать строку Unicode в библиотеку, но я получаю странное поведение при попытке.

В моей собственной общей библиотеке у меня есть следующий код:

extern "C" void logANSI(const char* data) {
__android_log_print(ANDROID_LOG_INFO, "StringMarshaling", "ANSI data: %s", data);
}

extern "C" void logUnicode(const wchar_t* data) {
__android_log_print(ANDROID_LOG_INFO, "StringMarshaling", "Unicode data: %ls", data);
}

На стороне C # у меня есть следующее DllImport декларации:

[DllImport("StringMarshaling", EntryPoint = "logANSI", SetLastError = true, CharSet = CharSet.Ansi, ThrowOnUnmappableChar = true)]
public static extern void LogANSI([MarshalAs(UnmanagedType.LPStr)] string data);

[DllImport("StringMarshaling", EntryPoint = "logUnicode", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern void LogUnicode([MarshalAs(UnmanagedType.LPWStr)] string data);

Тогда у меня есть следующий код в моей деятельности:

  StringMarshaling.LogANSI("12345");
StringMarshaling.LogUnicode("12345");

В выводе журнала я вижу:

05-17 18:07:12.437  Unitech PA700 Info  8351  StringMarshaling  ANSI data: 12345
05-17 18:07:12.437  Unitech PA700 Info  8351  StringMarshaling  Unicode data: 1

Как я могу получить полную строку, а не только первый символ?

4

Решение

__android_log_print принимает char *, так:

Используя эту функцию C / C ++:

extern "C" void logUnicode(const wchar_t* data) {
std::wstring fooStr = std::wstring(data);
__android_log_print(ANDROID_LOG_INFO, "StringMarshaling", "Unicode data: %s", fooStr.c_str());
}

С этим DllImport:

[DllImport("StringMarshaling", EntryPoint = "logUnicode", SetLastError = true)]
public static extern void LogUnicode(string data);

Вызов:

StringMarshaling.LogUnicode("1��2��3��4��5");

Приведет к:

[StringMarshaling] Unicode data: 1��2��3��4��5
2

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

Других решений пока нет …

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