एंड्रॉइड स्टूडियो के 1.0 के अपडेट के साथ, एनडीके टूलचैन समर्थन में काफी सुधार हुआ ( ध्यान दें: कृपया इस पोस्ट के निचले भाग पर मेरे अपडेट को नए प्रयोगात्मक ग्रेडल प्लगइन और एंड्रॉइड स्टूडियो 1.5 के साथ उपयोग करने के लिए पढ़ें )।
एंड्रॉइड स्टूडियो और एनडीके को अच्छी तरह से एकीकृत किया जाता है ताकि आपको अपने मॉड्यूल के build.gradle में एक ndk {} ब्लॉक बनाने की आवश्यकता हो, और अपने स्रोत फ़ाइलों को (मॉड्यूल) / src / main / jni निर्देशिका में सेट करें - और आप किया हुआ!
कमांड लाइन से अधिक ndk-build नहीं।
मैंने अपने ब्लॉग पोस्ट में इसके बारे में सब कुछ यहाँ लिखा है: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
मुख्य बिंदु हैं:
यहां आपको दो चीजें जानने की जरूरत है। डिफ़ॉल्ट रूप से, यदि आपके बाहरी लोड हैं, जिन्हें आप Android एप्लिकेशन में लोड करना चाहते हैं, तो उन्हें डिफ़ॉल्ट रूप से (मॉड्यूल) / src / main / jniLibs के लिए देखा जाता है। आप अपने मॉड्यूल के build.gradle में sourceSets.main.jniLibs.srcDirs की सेटिंग का उपयोग करके इसे बदल सकते हैं। आपको प्रत्येक आर्किटेक्चर के लिए पुस्तकालयों के साथ एक उपनिर्देशिका की आवश्यकता होगी जिसे आप लक्षित कर रहे हैं (जैसे x86, हाथ, mips, arm64-v8a, आदि)
जिस कोड को आप डिफ़ॉल्ट रूप से NDK टूलकिन द्वारा संकलित करना चाहते हैं, वह (मॉड्यूल) / src / main / jni में स्थित होगा और इसी तरह ऊपर, आप अपने मॉड्यूल के build.gradle में sourceSets.main.jni.srcDirs सेट करके इसे बदल सकते हैं।
और इसे अपने मॉड्यूल के build.gradle में डालें:
ndk {
moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}
यह आपके C ++ कोड को संकलित करने की प्रक्रिया है, वहां से आपको इसे लोड करने की आवश्यकता है, और रैपर बनाने की आवश्यकता है - लेकिन अपने प्रश्न से देखते हुए, आप पहले से ही जानते हैं कि यह सब कैसे करना है, इसलिए मैं फिर से हैश नहीं करूंगा।
इसके अलावा, मैंने इस उदाहरण का एक Github रेपो यहां रखा है: http://github.com/sureshjoshi/android-ndk-swig-example
अद्यतन: 14 जून, 2015
जब एंड्रॉइड स्टूडियो 1.3 बाहर आता है, तो JetBrains CLion प्लगइन के माध्यम से C ++ के लिए बेहतर समर्थन होना चाहिए। मैं वर्तमान में इस धारणा के तहत हूं कि यह एंड्रॉइड स्टूडियो के भीतर जावा और सी ++ विकास की अनुमति देगा; हालाँकि मुझे लगता है कि हमें अभी भी ग्रेडल एनडीके अनुभाग का उपयोग करने की आवश्यकता होगी जैसा कि मैंने ऊपर कहा है। इसके अतिरिक्त, मुझे लगता है कि अभी भी जावा <-> C ++ रैपर फ़ाइलों को लिखने की आवश्यकता होगी, जब तक कि CLion स्वचालित रूप से ऐसा नहीं करेगा।
अद्यतन: 5 जनवरी, 2016
मैंने अपने ब्लॉग और जीथब रेपो (विकसित शाखा में) को नवीनतम प्रयोगात्मक ग्रैडल प्लगइन (0.6.0-अल्फा 3) के साथ एंड्रॉइड स्टूडियो 1.5 का उपयोग करने के लिए अपडेट किया है।
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
http://github.com/sureshjoshi/android-ndk-swig-example
NDK सेक्शन के लिए ग्रैड बिल्ड अब इस तरह दिखता है:
android.ndk {
moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
cppFlags.add("-fexceptions")
stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}
इसके अलावा, काफी अजीब तरह से, एंड्रॉइड स्टूडियो में C ++ के लिए ऑटो-पूर्ण है - 'मूल' कीवर्ड का उपयोग करके जावा उत्पन्न रैपर:
हालाँकि, यह पूरी तरह से रस्साकसी नहीं है ... यदि आप ऑटो-कोड कोड के लिए लाइब्रेरी को लपेटने के लिए SWIG का उपयोग कर रहे हैं, और फिर मूल कीवर्ड ऑटो-पीढ़ी का उपयोग करने का प्रयास करते हैं, तो यह कोड को आपके Swig _wrap में गलत स्थान पर डाल देगा। .cxx फ़ाइल ... तो आपको इसे "एक्सटर्नल सी" ब्लॉक में ले जाना होगा:
अद्यतन: 15 अक्टूबर, 2017
यदि मैं यह उल्लेख नहीं करता कि मैं एंड्रॉइड स्टूडियो 2.2 के बाद मूल रूप से 'देशी' (कोई दंड नहीं) का समर्थन करता हूं, तो ग्रेड और सीमेक के माध्यम से एनडीके टूलचैन के लिए मुझे याद होगा। अब, जब आप एक नया प्रोजेक्ट बनाते हैं, तो बस C ++ सपोर्ट चुनें और आप जाने के लिए अच्छे हैं।
आपको अभी भी अपना स्वयं का जेएनआई लेयर कोड जनरेट करना होगा, या मैंने ऊपर बताई गई SWIG तकनीक का उपयोग किया होगा, लेकिन Android प्रोजेक्ट में C ++ का मचान अब तुच्छ है।
CMakeLists फ़ाइल में परिवर्तन (जो आप अपनी C ++ स्रोत फ़ाइलों को रखते हैं) को एंड्रॉइड स्टूडियो द्वारा उठाया जाएगा, और यह स्वचालित रूप से किसी भी संबंधित लाइब्रेरी को फिर से संकलित करेगा।