Pull to refresh

Comments 8

На какую примерно версию GCC можно ориентироваться?
Можно ли свободно использовать STL?
И есть ли более подробный список ограничений?

Просто где-то год назад, когда попытался скомпилировать довольно простой код для Android 1.6 — получил миллиард ошибок, в том числе из-за отсутствия STL в комплекте.
NDK r5 (текущая версия) использует для сборки проектов gcc 4.4.3 (по умолчанию) и gcc 4.4.0 (можно включить при необходимости).

Можно использовать две версии STL: STLPort и GNU STL. Никаких серьезных проблем при портировании больших проектов не встречалось.

Полностью или частично недоступны: RTTI (полностью), исключения C++ (в использующих STL модулях), wchar_t (появился только начиная с Android 2.3 Gingerbread, не рекомендуется Google для использования в новом коде).

В целом, ощущения от NDK очень позитивные. Все работает.
Спасибо за развернутый ответ.
Не очень только понимаю, что плохого в wchar_t, наш проект его активано использует, а UTF8 далеко не всегда удобен.
Судя по всему пришла пора попробовать сделать портирование на 2.3 и 3.0+, судя по вышеописанным ограничениям, должно сработать.
RTTI и исключения доступны и работают в реальном большом проекте. Никаких трудностей с ними пока замечено не было. Для включения добавляем в Application.mk вот такие строчки, как и показано выше:

APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions

gcc в текущем NDK r5c вот такой:

$ gcc --version
gcc (GCC) 4.3.4 20090804 (release) 1

А про остальное ответил strikov.
(1) Про gcc

В текущем NDK r5c присутствуют следующие toolchain'ы:
arm-linux-androideabi-4.4.3 (по умолчанию)
arm-eabi-4.4.0

Проверьте, пожалуйста, еще раз версию gcc, которую вы используете.
Версия 4.3.4 очень старая по меркам gcc.

Даже используемая сейчас 4.4.3 на самом деле далека от совершенства потому как, например, отвратительно работает с NEON intrinsics

(2) Про RTTI и исключения

Насколько я знаю исключения и RTTI доступны только при использовании GNU STL.
При использовании STLPort ими пользоваться нельзя.

Могу только похвалить за то, что используете подмножество STL доступное и там и там.
В проектах, анализом которых я занимался, STLPort был жизненно необходим. Со всеми вытекающими.
(1) Про gcc согласен. Зашёл в arm-linux-androideabi-4.4.3 и там gcc говорит что он 4.4.3. Видимо у меня 4.3.4 просто cygwin из путей находит.

(2) Тот проект, где используются RTTI и исключения, действительно только под GNU STL.

А почему именно был нужен STLPort?
Рекомендую обратиться к презентации моего коллеги Ларса Бишопа о нашем опыте портирования больших игровых проектов на платформу Android: Bringing High-end 3D Games to Android
Что-то я не понимаю как Eclipse+Cygwin заставить видеть всю STL. Нужные флаги прописаны, но он в упор не видит всю библиотеку (, например).
Sign up to leave a comment.

Articles