2012-07-30 9 views
5

Tôi cố gắng để biên dịch chương trình đơn giản này với android-ndk-r8b:
JNI/hello_jni.cppCách sử dụng chuỗi C++ 0x trong 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 trả về cho tôi một lỗi cho rằng 'thread' không phải là thành viên của 'std'. I ban hành ndk-xây dựng -n để có được lệnh biên soạn và phát hành nó một mình trong vỏ của tôi:

/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 

Tôi đọc rất nhiều bài/câu hỏi về chủ đề POSIX và đề C++, nhưng vẫn không thể tìm thấy tôi câu trả lời. tập tin arm-linux-androideabi/include/c++/4.6/thread tôi định nghĩa class thread chỉ std:

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

Họ dường như không được định nghĩa trong sdk của tôi (C++ config.h). Nhưng làm thế nào tôi có thể biến chúng một cách an toàn? Tôi có cần phải biên dịch toolchain của riêng tôi để sử dụng (không-p) đề? Máy tính lưu trữ của tôi là:

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 

Trả lời

6

Android NDK r8b đi kèm với gcc 4.6 và không chứa bất kỳ triển khai nào của chủ đề C++ 11. Bạn sẽ phải cung cấp các triển khai của riêng bạn và có thể xây dựng chuỗi công cụ gcc độc lập của riêng bạn.

Kiểm tra các trang này cho C++ 11 hỗ trợ trong gcc:

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

POSIX đề là một câu chuyện hoàn toàn khác nhau và bạn có thể sử dụng chúng trong Android NDK. Bạn sẽ cần ít nhất pthread_create(), pthread_detach()pthread_join() cuộc gọi để thực hiện.

+1

Cảm ơn Sergey. Tại sao bộ android đưa vào/C++/4.6/header trong NDK?Làm thế nào để bạn thực hiện một số công cụ đa luồng với NDK trong Android mà không cần ? Bạn có sử dụng các chủ đề POSIX không? –

+0

Tôi sử dụng chủ đề POSIX trong Android. Họ làm việc tốt. Tôi không có ý tưởng về các tiêu đề mới trong chuỗi công cụ 4.6. –

+0

Ok cảm ơn. @ commoncpp @ cung cấp lớp Thread, tôi sẽ thử điều đó. –

2

Thư viện chủ đề STL được lấy cảm hứng từ thư viện boost, mà bạn có thể biên dịch cho hệ điều hành Android. Do đó, biên dịch Boost.Thread để có được một thay thế, nhưng tương tự, thực hiện.

+0

Tôi không sử dụng Boost nhưng [commoncpp2-1.8.1] (http://www.gnu.org/software/commoncpp) có tính năng triển khai chuỗi. Cần vài thay đổi để xây dựng nó trong Android ndk. –

+1

bạn đã không, nhưng bạn có thể, nếu bạn muốn 'tăng :: thread'. Một xấp xỉ 'std :: thread' – user1095108

4

Đang cập nhật ở đây vì đây là kết quả hàng đầu cho std :: tôi vấn đề this_thread:

hỗ trợ Threading đã được cải thiện trong r8e mới nhất NDK phát hành (tháng 3 năm 2013). Đảm bảo rằng bạn đang sử dụng NDK và toolchain mới nhất và các vấn đề của bạn có thể được giải quyết một cách trivially.

Chỉnh sửa: Thay đổi sửa đổi được liệt kê đơn giản là "Hỗ trợ luồng được bật trong chuỗi công cụ GCC/MIPS". Ở mức tối thiểu nó thêm hỗ trợ cho std :: this_thread :: sleep_for. Nếu ai đó biết tài liệu chi tiết hơn về mức độ hỗ trợ mới, vui lòng liên kết tài liệu đó.

+0

+1 Điều cần biết. Bạn có thể chỉnh sửa câu trả lời của mình bằng những gì họ đã thêm chính xác không? –