std::chrono с NDK r10e не может быть разрешен

Не подумайте, что я не искал, мой Android-проект (на Eclipse) отказывается распознавать библиотеку std::chrono. Включение в мой заголовочный файл в порядке:

#include <chrono>

Но когда я хочу использовать его:

using namespace std::chrono;

У меня: Символ "хроно" не может быть разрешен, и все функции хроно недоступны. Поэтому я использую NDK r10e, я добавляю несколько строк в свой Application.mk, который теперь выглядит так:

APP_PLATFORM := android-22
APP_STL := gnustl_static
APP_CPPFLAGS := -std=gnu++11
NDK_TOOLCHAIN_VERSION := 4.8

И в моем Android.mk я добавляю:

LOCAL_CFLAGS += -std=gnu++11

Это не решило мою проблему. Любые идеи ? Плохая конфигурация Eclipse? После изменений в файлах mk я собрал и пересобрал свой проект.


person M. Blayo    schedule 09.03.2016    source источник
comment
Если вы используете -std=c++11 вместо -std=gnu++11, есть ли разница?   -  person zenzelezz    schedule 09.03.2016
comment
Я пробовал, разницы нет...   -  person M. Blayo    schedule 09.03.2016


Ответы (1)


Это известная проблема GNU libstdc++ в Android NDK. Он построен на основе очень ограниченной библиотеки libc (Google Bionic) и поэтому не может обеспечить полную функциональность стандартной библиотеки C++. В частности, std::chrono почти полностью отключается во время сборки, но не только std::chrono. Многие другие классы и функции отключены, поэтому NDK Google просто не полностью поддерживает C++.

Вы можете переключиться на LLVM libc++ (APP_STL := c++_static), но он имеет экспериментальный статус в Google Android NDK и фактически нестабилен (т.е. вызывает сбои в приложении даже для полностью стандартного кода C++). Эта нестабильность вызвана той же причиной, что и для GNU libstdc++, т. е. тем, что она построена на основе очень ограниченной libc.

Я бы порекомендовал перейти на CrystaX NDK — альтернативный форк Android NDK от Google, который я начал в основном для решения проблем Google NDK, таких как нестандартные реализации libc, libc++ и т. д. CrystaX NDK разработан для замены NDK Google (за исключением того факта, что он предоставляет полностью соответствующие стандарту низкоуровневые библиотеки ). В CrystaX NDK и GNU libstdc++, и LLVM libc++ гораздо более стабильны и полностью соответствуют стандарту C++, по крайней мере, на том же уровне, что и в GNU/Linux. В частности, std::chrono там полностью реализован и работает просто отлично. Кроме того, в CrystaX NDK можно использовать более свежие компиляторы, такие как gcc-5.3 и clang-3.7, с улучшенной поддержкой C++11 и C++14. Я буду рад, если это поможет вам.

person Dmitry Moskalchuk    schedule 09.03.2016
comment
Спасибо за ваш ответ, но он не работает... std::chrono всегда неизвестен. Мне не нравится C++, и CrystaX NDK вылетает из моего приложения, оно компилируется (когда я комментирую хроно), но не запускается (файл не найден в папке NDK). Впрочем, я отложил это на будущее, сейчас нет времени. - person M. Blayo; 09.03.2016
comment
Это не работает, когда вы переключаетесь на c++_static с Android NDK r10e? Или не работает при переключении на CrystaX NDK? В любом случае, в обоих случаях я уверен, что вы делаете что-то не так, просто потому, что std::chrono определенно доступен в обоих случаях. Вероятно, что-то не так с вашим Application.mk или Android.mk. Я вижу, вы отложили это, но если вы решите вернуться к этому, я бы рекомендовал сначала построить простой случай и посмотреть, работает ли он (на самом деле, он должен), а затем переключиться на более сложный случай. - person Dmitry Moskalchuk; 09.03.2016
comment
Только что попробовал перейти на c++_static и мой Eclipse не поддерживает его, не знаю почему... Насчет CrystaX, уверен, что ты прав, я что-то не так делаю, но что? В следующий раз я сделаю, как вы сказали: простой пример. Спасибо - person M. Blayo; 09.03.2016