M. Blayo
M. Blayo

Reputation: 11

std::chrono with NDK r10e could not be resolved

Do not think I did not search, my Android project (on Eclipse) refuses to recognize std::chrono library. The include is OK in my header file :

#include <chrono>

But when I want use it :

using namespace std::chrono;

I have a : Symbol 'chrono' could not be resolved, and all the functions of chrono are unavailables. So I use NDK r10e, I add some lines in my Application.mk, which now looks like this :

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

And in my Android.mk, I add :

LOCAL_CFLAGS += -std=gnu++11

It did not solve my problem. Any ideas ? Bad Eclipse configuration ? After modifications in mk files, I have build and re-build my project.

Upvotes: 1

Views: 1256

Answers (1)

Dmitry Moskalchuk
Dmitry Moskalchuk

Reputation: 1259

This is known problem of GNU libstdc++ in Android NDK. It's built on top of very limited libc (Google's Bionic) and thus can't provide full C++ Standard Library functionality. In particular, std::chrono is almost completely disabled at build time, but not only std::chrono. There are many other classes and functions being disabled, so Google's NDK just don't support C++ fully.

You can switch to LLVM libc++ (APP_STL := c++_static), but it has experimental status in Google's Android NDK and is actually unstable (i.e. it cause crashes in the application even for completely standard C++ code). This instability is caused by the same reason as for GNU libstdc++ - i.e. because it's built on top of very limited libc.

I'd recommend switch to CrystaX NDK - alternative fork of Google's Android NDK, which I've started mainly to solve Google's NDK problems such as non-standard implementations of libc, libc++, etc. CrystaX NDK is developed to work as a drop-in replacement for Google's NDK (except for the fact that it provides fully standard-conforming low-level libraries). In CrystaX NDK, both GNU libstdc++ and LLVM libc++ are much more stable and fully conforming to C++ standard, at least at the same level as they conform to it on GNU/Linux. In particular, std::chrono is fully implemented there and works just fine. Also, in CrystaX NDK, you can use more recent compilers such as gcc-5.3 and clang-3.7, with better support of C++11 and C++14. I'd be happy if it helps you.

Upvotes: 4

Related Questions