2012-07-30 9 views
5

मैं android-ndk-r8b के साथ इस साधारण प्रोग्राम को संकलित करने के कोशिश कर रहा हूँ:
JNI/hello_jni.cppAndroid NDK में C++ 0x थ्रेड का उपयोग कैसे करें?

#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 मुझे एक त्रुटि arguin देता है कि 'थ्रेड' 'std' का सदस्य नहीं है। मैं जारी NDK-निर्माण -n संकलन आदेश हो और मेरी खोल में इसे अकेले जारी करने के लिए:

/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 

मैं POSIX धागे और सी ++ धागे के बारे में धागे/ढेर सारे प्रश्न पढ़ा है, लेकिन अभी भी नहीं मिल सकता है मेरी जवाब। मेरे arm-linux-androideabi/include/c++/4.6/thread फ़ाइल केवल std में class thread परिभाषित करता है:

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

वे (C++ config.h) अपना SDK में परिभाषित किया जा करने के लिए नहीं है। लेकिन मैं उन्हें सुरक्षित रूप से कैसे चालू कर सकता हूं? क्या मुझे अपने स्वयं के टूलचेन को (गैर-पी) धागे का उपयोग करने की आवश्यकता है? मेरे मेजबान कंप्यूटर है:

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 

उत्तर

6

एंड्रॉयड NDK r8b जीसीसी 4.6 के साथ आता है और C++ 11 धागे के किसी भी कार्यान्वयन शामिल नहीं है। आपको अपने स्वयं के कार्यान्वयन और संभवतः अपना खुद का स्टैंडअलोन जीसीसी टूलचेन बनाना होगा।

चेक जीसीसी में सी ++ 11 समर्थन के लिए इन पृष्ठों:

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

POSIX धागे एक पूरी तरह से अलग कहानी है और आप एंड्रॉयड NDK में उन्हें इस्तेमाल कर सकते हैं। आपको कम से कम pthread_create(), pthread_detach() और pthread_join() कॉल करने की आवश्यकता होगी।

+1

धन्यवाद सर्गेई। एंड्रॉइड लोक ने एनडीके में/सी ++/4.6/थ्रेड हेडर फ़ाइल क्यों डाली? के बिना एंड्रॉइड में एनडीके के साथ आप कुछ मल्टीथ्रेडिंग सामग्री कैसे करते हैं? क्या आप पॉज़िक्स धागे का उपयोग करते हैं? –

+0

मैं एंड्रॉइड में पॉज़िक्स धागे का उपयोग करता हूं। वे ठीक काम करते हैं। मुझे 4.6 टूलचेन में नए शीर्षकों के बारे में कोई जानकारी नहीं है। –

+0

ठीक है धन्यवाद। @ commoncpp @ वर्ग थ्रेड प्रदान करता है, मैं कोशिश करूँगा। –

2

एसटीएल थ्रेड लाइब्रेरी boost लाइब्रेरी से प्रेरित है, जिसे आप एंड्रॉइड ओएस के लिए संकलित कर सकते हैं। इसलिए, वैकल्पिक, लेकिन समान, कार्यान्वयन प्राप्त करने के लिए Boost.Thread संकलित करें।

+0

मैंने बूस्ट का उपयोग नहीं किया लेकिन [commoncpp2-1.8.1] (http://www.gnu.org/software/commoncpp) जिसमें थ्रेड कार्यान्वयन की सुविधा है। Android ndk में इसे बनाने के लिए आवश्यक कुछ बदलाव। –

+1

आपने नहीं किया, लेकिन यदि आप 'बूस्ट :: थ्रेड' चाहते हैं, तो आप कर सकते हैं। 'Std :: thread' – user1095108

4

यहाँ अपडेट कर रहा है क्योंकि यह मेरा std :: this_thread समस्या के लिए शीर्ष परिणाम था:

थ्रेडिंग समर्थन नवीनतम r8e NDK रिलीज में सुधार किया गया है (मार्च 2013)। सुनिश्चित करें कि आप नवीनतम एनडीके और टूलचेन का उपयोग कर रहे हैं और आपकी समस्याओं को हल किया जा सकता है।

संपादित करें: संशोधन परिवर्तन को बस "जीसीसी/एमआईपीएस टूलचैन में सक्षम थ्रेडिंग समर्थन" के रूप में सूचीबद्ध किया गया है। कम से कम यह std :: this_thread :: sleep_for के लिए समर्थन जोड़ा गया। अगर किसी और को नए समर्थन की सीमा के बारे में अधिक विस्तृत दस्तावेज के बारे में पता है तो कृपया इसे लिंक करें।

+0

+1 का अनुमान लगभग जानना अच्छा है। क्या आप अपना उत्तर सही तरीके से जोड़कर संपादित कर सकते हैं? –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^