2012-07-30 15 views
5

estoy tratando de compilar este programa sencillo con android-ndk-r8b:
JNI/hello_jni.cppCómo usar el hilo C++ 0x en Android NDK?

#include <iostream> 
#include <thread> 

void hello() 
{ 
    std::cout << "Hi i'm a thread!!!" << std::endl; 
} 

int main() 
{ 
    std::thread th(hello); 
    th.join(); 
    return 0; 
} 

JNI/Application.mk

APP_OPTIM := release 
APP_MODULES := hello_thread 
APP_STL := gnustl_static 

JNI/Android.mk

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_CPPFLAGS += -std=c++0x -frtti 

LOCAL_MODULE  := hello_thread 
LOCAL_LDLIBS  := -L$(SYSROOT)/usr/lib -pthread 
LOCAL_SRC_FILES := hello_thread.cpp 

include $(BUILD_EXECUTABLE) 

ndk-build me devuelve un error arguin que 'thread' no es un miembro de 'std'. I emitió NDK-construir -n para obtener el comando de compilación y emitida solo en mi concha:

/home/evigier/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ -MMD -MP -MF /home/evigier/eclipse_workspace/hello_thread/obj/local/armeabi/objs/hello_thread/hello_thread.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -I/home/evigier/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include -I/home/evigier/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/include -I/home/evigier/eclipse_workspace/hello_thread/jni -DANDROID -Wa,--noexecstack -std=c++0x -frtti -O2 -DNDEBUG -g -I/home/evigier/android-ndk-r8b/platforms/android-14/arch-arm/usr/include -c /home/evigier/eclipse_workspace/hello_thread/jni/hello_thread.cpp -o /home/evigier/eclipse_workspace/hello_thread/obj/local/armeabi/objs/hello_thread/hello_thread.o 
Compile++ thumb : hello_thread <= hello_thread.cpp 
In file included from /home/evigier/android-ndk-r8b/platforms/android-14/arch-arm/usr/include/stdio.h:55:0, 
       from /home/evigier/android-ndk-r8b/platforms/android-14/arch-arm/usr/include/wchar.h:33, 
       from /home/evigier/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/cwchar:46, 
       from /home/evigier/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/postypes.h:42, 
       from /home/evigier/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/iosfwd:42, 
       from /home/evigier/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/ios:39, 
       from /home/evigier/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/ostream:40, 
       from /home/evigier/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/iostream:40, 
       from jni/hello_thread.cpp:4: 
/home/evigier/android-ndk-r8b/platforms/android-14/arch-arm/usr/include/sys/types.h:124:9: error: 'uint64_t' does not name a type 
/home/evigier/eclipse_workspace/hello_thread/jni/hello_thread.cpp: In function 'int main()': 
/home/evigier/eclipse_workspace/hello_thread/jni/hello_thread.cpp:14:5: error: 'thread' is not a member of 'std' 
/home/evigier/eclipse_workspace/hello_thread/jni/hello_thread.cpp:14:17: error: expected ';' before 'th' 
/home/evigier/eclipse_workspace/hello_thread/jni/hello_thread.cpp:15:5: error: 'th' was not declared in this scope 

He leído un montón de hilos/preguntas sobre los hilos POSIX y los hilos de C++, pero todavía no puedo encontrar mi responder. Mi archivo arm-linux-androideabi/include/c++/4.6/thread define class thread sólo std: no parecen

#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) 

Ellas deben definirse en mi SDK (C++ config.hy). Pero, ¿cómo puedo activarlos de forma segura? ¿Debo compilar mi propia cadena de herramientas para usar subprocesos (no p)? Mi equipo host es:

Linux evigier-ThinkPad-X220 3.0.0-17-generiC#30-Ubuntu SMP Thu Mar 8 20:45:39 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux 

Respuesta

6

Android NDK R8b viene con gcc 4.6 y no contiene ninguna aplicación de C++ 11 hilos. Tendrás que proporcionar tus propias implementaciones y posiblemente construir tu propia cadena de herramientas de gcc.

Comprobar estas páginas para el apoyo de C++ 11 en gcc:

  1. http://gcc.gnu.org/projects/cxx0x.html
  2. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x

hilos POSIX es una historia completamente diferente y se puede utilizar en Android NDK. Necesitará al menos pthread_create(), pthread_detach() y pthread_join() llamadas para hacerlo.

+1

Gracias Sergey. ¿Por qué entonces la gente de android puso incluir/C++/4.6/thread header file en el NDK?¿Cómo se hacen algunas cosas de subprocesamiento múltiple con el NDK en Android sin ? ¿Usas hilos POSIX? –

+0

Uso los hilos POSIX en Android. Ellos funcionan bien. No tengo idea de los nuevos encabezados en la cadena de herramientas 4.6. –

+0

Bien, gracias. @ commoncpp @ proporciona clase Thread, intentaré eso. –

2

La biblioteca de hilos STL está inspirada en la biblioteca boost, que puede compilar para el sistema operativo Android. Por lo tanto, compilar Boost.Thread para obtener una implementación alternativa, pero similar.

+0

No utilicé Boost pero [commoncpp2-1.8.1] (http://www.gnu.org/software)/commoncpp) que presenta implementación de subprocesos. Pocos cambios necesarios para compilarlo en Android ndk. –

+1

no lo hiciste, pero puedes, si quieres 'boost :: thread'. Una aproximación de 'std :: thread' – user1095108

4

Actualización de aquí porque este fue el primer resultado para mi std :: problema this_thread:

apoyo de roscado se ha mejorado en la versión más reciente NDK 8e (marzo de 2013). Asegúrese de estar utilizando el último NDK y toolchain, y sus problemas pueden resolverse trivialmente.

Editar: El cambio de revisión se enumera simplemente como "Soporte habilitado para enhebrar en la cadena de herramientas GCC/MIPS". Como mínimo, agregó soporte para std :: this_thread :: sleep_for. Si alguien más conoce documentación más detallada sobre el alcance del nuevo soporte, conéctelo.

+0

+1 Es bueno saberlo. ¿Puedes editar tu respuesta con lo que agregaron exactamente? –