Xamarin Android:将字符串从 C# 编组为 C++ 中的 Unicode 字符串的正确方法是什么?

The*_*ned 5 c# c++ android xamarin.android xamarin

我正在编写一个 Xamarin Android 应用程序,并尝试编写一个 Xamarin 应用程序需要向其传递数据的 C++ 本机库。我需要将 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);
}
Run Code Online (Sandbox Code Playgroud)

在 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);
Run Code Online (Sandbox Code Playgroud)

然后我的活动中有以下代码:

  StringMarshaling.LogANSI("12345");
  StringMarshaling.LogUnicode("12345");
Run Code Online (Sandbox Code Playgroud)

在日志输出中,我看到:

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
Run Code Online (Sandbox Code Playgroud)

如何获取完整字符串,而不仅仅是第一个字符?

Sus*_*ver 3

__android_log_print接受 a 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());
}
Run Code Online (Sandbox Code Playgroud)

使用此 DllImport:

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

呼叫:

StringMarshaling.LogUnicode("12345");
Run Code Online (Sandbox Code Playgroud)

将导致:

[StringMarshaling] Unicode data: 12345
Run Code Online (Sandbox Code Playgroud)