在我的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
提前做好准备。答案 0 :(得分:0)
我发现了问题。基本上wcstombs()API在android NDK中不起作用。我编写了自己的API,解决了我的问题。
答案 1 :(得分:0)
您的代码中有2个错误:
%S
格式说明符是非标准扩展名(来自SUSv2)。它指示printf
将参数解释为wchar_t*
。std::wstring
对象而不是字符串指针。这是未定义的行为。如果您知道您的平台支持%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了解解决方案。