Android NDK应用程序中的wstring支持

时间:2014-08-26 12:44:23

标签: android c++ linux android-ndk

在我的Android NDK应用程序中,我可以定义wstring str = L" my string"。它编译和链接很好。

当我使用__android_log_print(ANDROID_LOG_DEBUG," tag"," JNI已初始化...%S",str);

这是打印JNI已初始化... S,但我希望打印" JNI已初始化...我的字符串"

注意:我的Application.mk中有APP_STL:= gnustl_static

提前做好准备。

2 个答案:

答案 0 :(得分:0)

我发现了问题。基本上wcstombs()API在android NDK中不起作用。我编写了自己的API,解决了我的问题。

答案 1 :(得分:0)

您的代码中有2个错误:

  1. %S格式说明符是非标准扩展名(来自SUSv2)。它指示printf将参数解释为wchar_t*
  2. 您正在传递std::wstring对象而不是字符串指针。这是未定义的行为。
  3. 如果您知道您的平台支持%S,并且您想要使用此非标准扩展程序,则只需修复您的参数传递:

    __android_log_print(ANDROID_LOG_DEBUG, "tag", "JNI got initialized ...%S", str.c_str());
    

    如果您希望遵守代码标准,则必须使用%s并使用std::string,或在调用{之前从std::wstring转换为std::string {1}}。请注意,您仍然必须传递字符串指针(即__android_log_print)。


    如果由于str.c_str()在Android上产生无效输出而导致上述情况无法产生预期结果,请参阅this Q&A了解解决方案。