Android-ndk gnustl_static exe не работает - PullRequest
3 голосов
/ 15 февраля 2011

Я не могу получить следующий тривиальный код для компиляции / компоновки, и проблема кажется специфической для std :: wstring и библиотеки C ++ gnustl_static.Буду признателен за любую помощь.

файл 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-файл в эмулятор и запустив его через оболочку.

Мне понадобится использовать реализацию gnustl для поддержки исключений c ++, иначе я бы пошел с stlport_shared.Любые подсказки, почему приведенный выше пример работает для stlport_static, но не для gnustl_static?

Ответы [ 4 ]

1 голос
/ 15 февраля 2011

Из заголовочных файлов платформ \ 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_t4 байта.

#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.

1 голос
/ 31 марта 2011

Это проблема с файлом $ NDK / sources / cxx-stl / gnu-libstdc ++ / Android.mk

Добавьте в этот файл следующую строку:

LOCAL_MODULE_FILENAME := libstdc++
1 голос
/ 15 февраля 2011

Какая у вас целевая ОС? Согласно этот поток , gnustl_static не поддерживает wchar_t до 2.3.

0 голосов
/ 07 апреля 2011

Убедитесь, что вы запустили "ndk-build clean" и вручную удалили каталоги libs / и obj /.

( Ссылка )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...