2013-06-17 9 views
16

के साथ नवीनतम सी ++ 11 फीचर्स मैं एंड्रॉइड एनडीके के साथ सी ++ 11 थ्रेडिंग सुविधाओं का उपयोग करने की कोशिश कर रहा हूं, लेकिन यह सुनिश्चित नहीं करता कि इसे नवीनतम कंपाइलर्स का उपयोग कैसे किया जाए।एंड्रॉइड एनडीके

मेरे पास क्लैंग 3.2 है और आईओएस ऐप्स बना सकते हैं। मुझे आश्चर्य है कि एंड्रॉइड एनडीके के साथ ऐसा करने का कोई तरीका है या नहीं?

यदि नहीं, तो मुझे जीसीसी 4.8 के साथ कैसे निर्माण करना चाहिए?

+0

उदा। देखें http://stackoverflow.com/questions/15269496/how-to-compile-c11-code-with-android-ndk-and-eclipse और http: // stackoverflow।कॉम/प्रश्न/1401465 9/एंड्रॉइड-एनडीके-त्रुटि-होना-सक्षम-साथ-the-std-c11-or-std-gnu11-compiler – Michael

+0

@ माइकल, मुझे क्लैंग 3.2 या जीसीसी 4.8 के साथ निर्माण करने की आवश्यकता है, या हो सुनिश्चित करें कि यह संभव नहीं है और pthreads का उपयोग करें। – Kimi

+0

चूंकि एनडीके संशोधन 10 डी - जीसीसी 4.8 सभी 32-बिट एबीआई –

उत्तर

12

NDK संशोधन 10 बजना 3.6 toolchain गया है। यह प्रयोग करें:

NDK_TOOLCHAIN_VERSION := clang3.6 

या आवेदन के सभी स्रोत कोड के लिए सी ++ 11 समर्थन सक्षम करने के लिए नवीनतम उपलब्ध बजना toolchain

NDK_TOOLCHAIN_VERSION := clang 
+0

अजीब, 'clang3.6' मेरे लिए 3.8 का उपयोग कर रहा है (वर्तमान में सबसे हालिया 5.1.1 पर, प्रीप्रोसेसर' # ifdef' के माध्यम से चेक किया गया है), जैसे 'clang'। और 'clang3.8' एक त्रुटि है। –

2

NDK revision 8e इसमें क्लैंग 3.2 कंपाइलर बंडल है। इसका इस्तेमाल करें और आप जाने के लिए अच्छे हैं।

+0

के लिए डिफ़ॉल्ट है, आप इस तरह एक कंपाइलर का उपयोग कर सकते हैं, लेकिन थ्रेडिंग का उपयोग करने के लिए कुछ और किया जाना है (मैं APP_STL: = gnustl_static का उपयोग कर रहा हूं) क्योंकि मैं हूं त्रुटि त्रुटि प्राप्त करना: नामस्थान 'std' में 'थ्रेड' नाम का कोई सदस्य नहीं; क्या आपका मतलब 'फ्रेड' था? – Kimi

+0

@ Kimi एनडीके दस्तावेज '$ एनडीके/डॉक्स/STABLE-APIS.html' में निम्नलिखित कहते हैं: 'ध्यान दें कि एंड्रॉइड सी लाइब्रेरी में पर्थ्रेड () के लिए समर्थन शामिल है, इसलिए" LOCAL_LIBS: = -lpthread "की आवश्यकता नहीं है। रीयल-टाइम एक्सटेंशन (सामान्य लिनक्स वितरण पर -lrt) के लिए भी यही सच है। क्या आप उन मुद्दों को पेस्ट कर सकते हैं जिन्हें आप प्रश्न में सामना करते हैं, क्योंकि इससे समस्या का पता लगाना आसान हो जाएगा? – Samveen

1

पहले, जो toolchain उपयोग करते हैं, अपने "application.mk" संपादित (android.mk साथ भ्रमित नहीं है) और जीसीसी 4.8 के लिए सम्मिलित करने के लिए तय करने के लिए:

NDK_TOOLCHAIN_VERSION := 4.8 

या यदि आप बजना हैं:

NDK_TOOLCHAIN_VERSION := clang 

लेकिन इसका धागे से कोई लेना देना नहीं है। यह केवल परिभाषित करेगा कि कौन सा टूलचेन उपयोग करना है।

#include <pthread.h> // <--- IMPORTANT 

// This will be used to pass some data to the new thread, modify as required 
struct thread_data_arguments 
{ 
    int value_a 
    bool value_b; 
}; 

//--------------------------------- 

// This function will be executed in the new thread, do not forget to put * at the start of the function name declaration 
void *functionRunningInSeparateThread(void *arguments) 
{ 
    struct thread_data_arguments *some_thread_arguments = (struct thread_data_arguments*)arguments; 

    if (some_thread_arguments->value_b == true) 
    { 
     printf("VALUE= %i", some_thread_arguments->value_a); 
    } 

    // Signal the end of the thread execution 
    pthread_exit(0); 
} 

//--------------------------------- 

// This is the actual function creating and starting the new thread 
void startThread() 
{ 
    // Lets pass some data to the new thread, you can pass anything even large data, 
    // for that you only need to modify thread_data_arguments as required 
    struct thread_data_arguments *some_thread_arguments; 
    some_thread_arguments = (thread_data_arguments*)malloc(sizeof(*some_thread_arguments)); 

    some_thread_arguments->value_a = 12345; 
    some_thread_arguments->value_b = true; 

    // Create and start the new thread 
    pthread_create(&native_thread, NULL, functionRunningInSeparateThread, (void*)some_thread_arguments) 
} 
1

NDK के लिए, बनाता खुला Application.mk और जोड़ने की जानकारी निम्नलिखित:

अब धागे के बारे में, यहाँ एंड्रॉयड NDK के लिए एक सरल उदाहरण है।

NDK_TOOLCHAIN_VERSION=4.7 

नोट:: यह (यदि r8e का उपयोग) में उपयोग कृपया मामले में 4.8 आप NDK संशोधन का उपयोग कर रहे 9.

18

(मैं NDK संस्करण r9b को संबोधित कर रहा हूँ) का उपयोग करें (, अन्यथा

# use this to select gcc instead of clang 
NDK_TOOLCHAIN_VERSION := 4.8 
# OR use this to select the latest clang version: 
NDK_TOOLCHAIN_VERSION := clang 


# then enable c++11 extentions in source code 
APP_CPPFLAGS += -std=c++11 
# or use APP_CPPFLAGS := -std=gnu++11 

अगर आप केवल अपने मॉड्यूल में सी ++ 11 समर्थन अपने Androi में इस लाइनों जोड़ना चाहते हैं: और इसलिए किसी भी मॉड्यूल) Application.mk में निम्नलिखित परिवर्तन करना शामिल उपयोग की बजाय d.mk APP_CPPFLAGS

LOCAL_CPPFLAGS += -std=c++11 

यहां अधिक पढ़ें: http://adec.altervista.org/blog/ndk_c11_support/

0

ध्यान दें कि एंड्रॉयड जीसीसी समर्थन अब मान्य नहीं है। अब आप क्लैंग का उपयोग कर रहे हैं। कृपया version 11 release notes पढ़ें। आप निर्दिष्ट कर सकते हैं:

NDK_TOOLCHAIN_VERSION=clang 

अपने स्थापित एनडीके के आधार पर नवीनतम संस्करण का उपयोग करने के लिए। इसके अलावा --- इस लेखन के रूप में --- नवीनतम एनडीके (v12) केवल एंड्रॉइड स्टूडियो के माध्यम से पहुंच योग्य है, न कि डाउनलोड पेज या स्टैंडअलोन एसडीके प्रबंधक के माध्यम से।

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