android-ndk gnustl_static exe无法正常工作

时间:2011-02-14 22:09:32

标签: android android-ndk

我似乎无法获得以下简单的代码来编译/链接,问题似乎特定于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的任何线索?

4 个答案:

答案 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