我似乎无法获得以下简单的代码来编译/链接,问题似乎特定于std :: wstring和gnustl_static C ++库。任何帮助将不胜感激。
main.cpp文件:
#include <string>
int main(void)
{
std::wstring wtest(L"Test");
return 0;
}
Application.mk文件:
APP_CFLAGS += -fexceptions
APP_STL := gnustl_static
Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestWCharApp
LOCAL_CFLAGS := -D_GLIBCXX_USE_WCHAR_T
LOCAL_SRC_FILES := main.cpp
include $(BUILD_EXECUTABLE)
尝试使用gnustl_static链接上述应用程序时,出现以下错误消息:
undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(wchar_t const*, std::allocator<wchar_t> const&)'
如果我将APP_STL更改为stlport_static并定义_STLP_HAS_WCHAR_T,似乎编译/链接/运行正常。我通过将exe上传到模拟器并通过shell运行来验证它的工作原理。
我将需要使用gnustl实现来获得c ++异常支持,否则我会使用stlport_shared。关于为什么上面的示例适用于stlport_static但不适用于gnustl_static的任何线索?
答案 0 :(得分:1)
你的目标操作系统是什么?根据{{3}},gnustl_static
不支持2.3之前的wchar_t。
答案 1 :(得分:1)
来自平台\ android - * \ arch-arm \ usr \ include \ wchar.h头文件:
/* IMPORTANT: Any code that relies on wide character support is essentially
* non-portable and/or broken. the only reason this header exist
* is because I'm really a nice guy. However, I'm not nice enough
* to provide you with a real implementation. instead wchar_t == char
* and all wc functions are stubs to their "normal" equivalent...
*/
有趣的是,在Android模拟器中运行以下简单程序显示wchar_t是4个字节。
#include <stdio.h>
int main(void)
{
printf("Size of wchar is %d\n", sizeof(wchar_t));
return 0;
}
另一件需要考虑的事情。 JNI桥提供了两种有用的方法来编组字符串数据。 GetStringUTFChars(返回const char )和GetStringChars(返回jchar )。你认为jchar被定义为多少字节... 2。
答案 2 :(得分:1)
这是文件$ NDK / sources / cxx-stl / gnu-libstdc ++ / Android.mk的问题
将以下行添加到该文件中:
LOCAL_MODULE_FILENAME := libstdc++
答案 3 :(得分:0)
确保运行“ndk-build clean”并手动删除libs /和obj / 目录。
( Reference )