安卓NDK使用gnustl_static库编译的可执行文件无法运行

3

我似乎无法编译/链接以下微不足道的代码,问题似乎特定于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个回答

1

从 platforms\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。


wchar_t 在所有的 Linux 系统上都是 4 个字节。 - Mārtiņš Možeiko

1
你的目标操作系统是什么?根据这个线程gnustl_static在2.3之前不支持wchar_t。

目标操作系统当前为2.1(API级别7)。我会测试一下2.3,看是否有任何区别。我希望能够找到一些关于wchar_t支持的官方文档,特别是与gnustl_static库相关的文档。 - Bellinghammer

1

这是与文件 $NDK/sources/cxx-stl/gnu-libstdc++/Android.mk 相关的问题

请在该文件中添加以下行:

LOCAL_MODULE_FILENAME := libstdc++

0
请确保运行 "ndk-build clean" 命令并手动删除 libs/ 和 obj/ 目录。
参考

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接