Home » Android » android – Setting up C++11 (std::thread) for NDK with ADT/Eclipse

android – Setting up C++11 (std::thread) for NDK with ADT/Eclipse

Posted by: admin June 15, 2020 Leave a comment

Questions:

I have been trying to use C++11. I am developing an android project and i want to use std::mutex. Along with OpenCV
But no matter what I do, I just cant seem to fix the Type 'mutex' could not be resolved
error.

I have tried following the tutorials i found on SO and other places.
LINK1 LINK2 LINK3LINK4

  1. ADT v22.3.0-887826
  2. Installed C/C++ compilers (CDT)

Following so many tutorials, it has become a real mess now. So I will explain my current settings

  • Project > Properties > C/C++ Build > Tool Chain Editor
    • Current Tool Chain is “Cross GCC”
    • Current Builder is “Android Builder”
  • Project > Properties > C/C++ Build > Discovery Options

    • Compiler invocation command is “gcc”
    • Compilter Invocation argments are -E -P -v -dD “${plugin_state_location}/specs.c -std=c++11”
  • Project > C/C++ General > Paths and Symbols > # Symbols tab

    • Symbol = __cplusplus and Value = 1

In my Application.mk file I have the following

APP_STL := gnustl_static
APP_USE_CPP0X := true
APP_CPPFLAGS := -std=c++11 -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8

I tried to change the cplusplus symbol’s value to 201103L
and tried __GXX_EXPERIMENTAL_CXX0X
with an empty value

But nothing seems to work, What am I doing wrong??

Any help is appreciated!

How to&Answers:

Support for std::thread is a bit special. The issue is addressed, for example, in this article by Binglong. The article is really short, but it can be summarized in one sentence:

You cannot use the (default) gcc 4.6 toolchain if you want to #include <thread> or #include <mutex>.

So, please add NDK_TOOLCHAIN_VERSION=4.8 or NDK_TOOLCHAIN_VERSION=clang to your Application.mk.

For ADT to rebuild its Index correctly, see Android NDK build, Method could not be resolved or Eclipse compiles successfully but still gives semantic errors.

Answer:

In Android.mk add LOCAL_CPPFLAGS := -std=c++11 -D __cplusplus=201103L then rebuild your project (for reconfiguring compiler). After rebuilding, your project automatically adds needed stl path into Path and Symbols

Answer:

If you upgrade the NDK or install a fresh version of Android Studio (2.1 at time of writing) and have Android Studio download the NDK for you you will get revision 12 – which has a lot of the std:: defines not defined in \ndk-bundle\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi-v7a\include\bits\c++config.h – ones relevant for threading being such as _GLIBCXX_HAS_GTHREADS which hides the thread class in “thread” for example.

It says that after revision 10e that gcc is deprecated. And with this all the defines as mentioned – which thoroughly buggered our thread dependant JNI code.

Clang as suggested in other posts is not a solution for us as it amongst other things seems not to support thead_local for example.
The solution is to revert back to revision 10e – which you can find at:

dl.google.com/android/ndk

Extract the package and copy into the sdk/ndk-bundle directory – make sure you delete the original revision 12 first.