Xamarin Android: как правильно маршалировать строку из C # в строку Unicode в C ++? - PullRequest
0 голосов
/ 18 мая 2018

Я пишу приложение для Xamarin для Android и пытаюсь также написать собственную библиотеку 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

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

1 Ответ

0 голосов
/ 18 мая 2018

__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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...