Я пишу приложение 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);

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

  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
TheSned 18 Май 2018 в 02:23

1 ответ

Лучший ответ

__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
SushiHangover 18 Май 2018 в 01:41