Я пишу приложение для 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
Как я могу получить полную строку, а не только первый символ?
__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("12345");
Приведет к:
[StringMarshaling] Unicode data: 12345
Других решений пока нет …