Android NDK r9b и компиляция C ++ 11

Я пытаюсь скомпилировать код C ++ 11, используя NDK r9b, однако независимо от того, что я пробовал, он не работает. Компиляция без возможностей C ++ 11 работает нормально.

Вот мой Application.mk:

NDK_TOOLCHAIN_VERSION := 4.8 APP_STL := gnustl_static 

Вот мой Android.mk:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp) LOCAL_CPPFLAGS := -std=c++11 -pthread -frtti -fexceptions LOCAL_MODULE := RAGEAndroid LOCAL_SRC_FILES := jni.c $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_LDLIBS := -llog -lm -landroid -lGLESv3 include $(BUILD_SHARED_LIBRARY) 

Я пробовал установить следующие слишком без везения:

 LOCAL_CFLAGS := -D__GXX_EXPERIMENTAL_CXX0X__ LOCAL_CPPFLAGS := -std=gnu++11 -pthread -frtti -fexceptions 

Я убедился, что Eclipse имеет следующие пути в C ++ general-> Paths and Symbols

 (ndk path)/sources/cxx-stl/gnu-libstdc++/4.8/include (ndk path)/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/include 

У меня есть один файл C (jni.c) и несколько тестов cpp / hpp. Все компилируется без каких-либо возможностей C ++ 11 и включает в себя что-то вроде <thread> или <memory>, не вызывает никаких жалоб, однако при создании объекта std :: thread я получаю «Тип» std :: thread ' Не разрешаться ». Это также происходит с другими функциями, которые я пытаюсь использовать (std :: unique_ptr, std :: shared_ptr, std :: move () и т. Д.).

Я прочитал много тем о том, как скомпилировать C ++ 11, но ничего не работает, я считаю, что что-то пропустил, но не могу понять, что это такое. Любая помощь будет оценена!

EDIT: Если я напечатаю __cplusplus, он отобразит 201103L, поэтому похоже, что он использует правильную версию.

EDIT 2: std :: atomic работает нормально.

Простите, следующее должно было быть комментарием, а не отвечать – потому что я не знаю, что не так в вашем коде, но вот что вы можете сделать, чтобы выяснить сами:


Вот мой минимальный Android.mk :

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := HelloJni.cpp LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY) 

Application.mk

 APP_CPPFLAGS := -std=c++11 NDK_TOOLCHAIN_VERSION=4.8 APP_STL=gnustl_static 

И вот минимальный HelloJni.cpp

 #include <jni.h> #include <thread> void doSomeWork( void ) { __android_log_print(ANDROID_LOG_DEBUG, "HelloJni", "hello from thread..."); return; } extern "C" jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { std::thread t( doSomeWork ); t.join(); return env->NewStringUTF("Hello from JNI !"); } 

Он строит чистую в r9b на моем Mac. Одна вещь, чтобы проверить: запустите ndk-build V=1 и убедитесь, что шаг ссылки похож на

 ~/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libhello-jni.so -shared --sysroot=~/android-ndk-r9b/platforms/android-17/arch-arm ./obj/local/armeabi/objs-debug/hello-jni/HelloJni.o ~/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/libgnustl_static.a -lgcc -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -L~/android-ndk-r9b/platforms/android-17/arch-arm/usr/lib -llog -lc -lm -o ./obj/local/armeabi/libhello-jni.so 

И проверить вывод команды

 ~/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86/bin/arm-linux-androideabi-nm -C ~/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/libgnustl_static.a | grep std::thread 

Вот что я получаю:

 00000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) 00000000 T std::thread::hardware_concurrency() 00000000 T std::thread::join() 00000000 T std::thread::detach() 

Может быть, вам нужно инвертировать строку:

 LOCAL_MODULE := RAGEAndroid 

С линией:

 LOCAL_CPPFLAGS := -std=c++11 -pthread -frtti -fexceptions 

Говорить, что эти флаги должны использоваться в текущем модуле (RageAndroid), а не в предыдущем модуле.

Кстати, в моем проекте мне нужно указать c ++ 11 с строкой выше (c ++ 0x <-> c ++ 11) (иначе это не сработало здесь).

 LOCAL_CPPFLAGS := -std=c++0x 
Intereting Posts
Автоматический выход приложения без предупреждения или ошибки Android: layout_alignParentBottom = "true" с использованием клавиатуры Объединение Spannable с String.format () Выполнение не выполнено для задачи ': app: compileDebugNdk' при попытке скомпилировать проект Android Studio с исходным кодом NDK Фрагмент onDestroyView называется, но просмотр не уничтожается Android 2.3.x javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: доверять привязке для пути сертификации не найдено Нужна горизонтальная прокрутка на макете стола Откройте приложение LinkedIn (страница профиля контакта) из моего приложения Android с использованием намерения? Android Мой размер APK Более 50 МБ Конвертировать андроид UI xml в код Android gridview сохраняет выбранный элемент Eclipse Android не будет очищать, не обновлять ресурсы Приглашение Spinner не показывает Как написать List <> в пакет ПРЕДУПРЕЖДЕНИЕ. В обоих списках зависимостей были указаны поддержка android-support-v4 и android-support-v13