दिलचस्प पोस्ट
नेस्टेड एनजी-दोहरा में 2 $ इंडेक्स वैल्यू को पारित करना कोणीय जे एस अज्ञात प्रदाता गैर स्थैतिक सदस्य आरंभकर्ताओं के साथ कक्षाओं के लिए सी + + 11 समग्र प्रारंभ आप सी # में वैकल्पिक पैरामीटर कैसे उपयोग कर सकते हैं? AngularJS: $ संसाधन (समाधान) का उपयोग करके फ़ाइलें अपलोड करें कृपया लूप में JavaScript बंद करने के उपयोग की व्याख्या करें एक हैशमैप में बराबर और हैशोड के कामकाज को समझना क्या मैं सी ++ में एक स्वायत्त 'स्वयं' सदस्य प्रकार को लागू कर सकता हूं? स्विफ्ट में एनएसई एक्सप्शन को पकड़ना NHibernate में उलटा गुण जेनेरिक एचटीएसीईएस www को गैर-www से पुनर्निर्देशित करता है java.net.UnknownHostException: सर्वर के लिए अमान्य होस्टनाम: स्थानीय वैराडीक टेम्पलेट के संदर्भ में "…" टोकन के नियम क्या हैं? एक अंत में बयान आग में कोड अगर मैं एक कोशिश ब्लॉक में एक मूल्य वापस करेंगे? कैसे MySQL में AUTO_INCREMENT रीसेट करें?

एंड्रॉइड के साथ जावा 7 भाषा की विशेषताएं

क्या सोच रहे हैं कि किसी ने एंड्रॉइड के साथ नई जावा 7 भाषा सुविधाओं का उपयोग करने की कोशिश की है? मुझे पता है कि एंड्रॉइड ने बाइटकोड पढ़ा है कि जावा बाहर निकलता है और इसे डेक्स में बदल देता है। तो मुझे लगता है मेरा प्रश्न यह है कि जावा 7 के बाइट कोड को समझ सकता है?

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड के साथ जावा 7 भाषा की विशेषताएं"

यदि आप एंड्रॉइड स्टूडियो का उपयोग कर रहे हैं, तो जावा 7 भाषा किसी पैच के बिना स्वचालित रूप से सक्षम होनी चाहिए। कोशिश-के-संसाधन के लिए एपीआई स्तर 19+ की आवश्यकता है, और NIO 2.0 सामान अनुपलब्ध हैं।

यदि आप जावा 7 सुविधाओं का उपयोग नहीं कर सकते, तो अपने build.gradle को संपादित करने के बारे में @ नूनो का जवाब build.gradle

निम्नलिखित ऐतिहासिक ब्याज के लिए ही है


जावा 7 का एक छोटा सा हिस्सा निश्चित रूप से एंड्रॉइड के साथ इस्तेमाल किया जा सकता है (ध्यान दें: मैंने केवल 4.1 पर परीक्षण किया है)।

सबसे पहले, आप ईक्लिप्स के एडीटी का इस्तेमाल नहीं कर सकते क्योंकि यह मुश्किल है कि केवल जावा कम्पाइलर 1.5 और 1.6 अनुरूप हैं। आप एडीटी को पुनः कंपाइल कर सकते हैं लेकिन मुझे लगता है कि एक साथ सभी एंड्रॉइड को फिर से कंपाइलिंग करने से कोई आसान तरीका नहीं है।

लेकिन आपको ग्रहण का उपयोग करने की आवश्यकता नहीं है। उदाहरण के लिए, एंड्रॉइड स्टूडियो 0.3.2 , इंटेलीज आईडीईए सीई और अन्य जावा-आधारित आईडीई एंड्रॉइड के लिए संकलन का समर्थन करते हैं और आप जावा 8 के साथ अनुपालन भी सेट कर सकते हैं:

  • फ़ाइल → परियोजना संरचना → मॉड्यूल → (दूसरी फलक पर मॉड्यूल उठाएं) → भाषा स्तर → ("7.0 – हीरे, एआरएम, बहु-पकड़, आदि" चुनें)

IntelliJ पर 7 जावा सक्षम करना

यह केवल जावा 7 भाषा सुविधाओं को अनुमति देता है , और आधे सुधार के कारण पुस्तकालय से आता है , और आप किसी भी चीज़ से शायद ही लाभ पा सकते हैं। वे सुविधाएं जो आप उपयोग कर सकते हैं वे हैं जो लाइब्रेरी पर निर्भर नहीं होती हैं:

  • डायमंड ऑपरेटर ( <> )
  • स्ट्रिंग स्विच
  • एकाधिक-पकड़ ( catch (Exc1 | Exc2 e) )
  • नंबर 1_234_567 में अंडरस्कोर ( 1_234_567 )
  • बाइनरी 0b1110111 ( 0b1110111 )

और इन सुविधाओं का अभी तक उपयोग नहीं किया जा सकता है :

  • try -के-संसाधन विवरण – क्योंकि इसमें गैर-मौजूदा इंटरफ़ेस "java.lang.AutoCloseable" की आवश्यकता है (यह सार्वजनिक रूप से 4.4+ में उपयोग किया जा सकता है)
  • @SafeVarargs एनोटेशन – क्योंकि "java.lang.SafeVarargs" मौजूद नहीं है

… "अभी तक" 🙂 यह पता चला है कि, हालांकि एंड्रॉइड की लाइब्रेरी 1.6 के लिए लक्षित कर रही है, एंड्रॉइड सोर्स में इंटरकॉसेस शामिल है, जैसे ऑटोक्लेसेबल और पारंपरिक इंटरफेस जैसे करीन्टेबल स्वत: क्लोज़ेबल से सुरक्षित होता है (सुरक्षित वर्गार् वास्तव में लापता है)। हम प्रतिबिंब के माध्यम से इसकी मौजूदगी की पुष्टि कर सकते हैं वे छिपे हुए हैं क्योंकि @hide पास @hide टैग है, जिसके कारण " @hide@hide " उन्हें शामिल नहीं किया गया।

पहले से ही मौजूदा प्रश्न के रूप में मैं छुपी हुई और आंतरिक एपीआई के साथ एंड्रॉइड एसडीके कैसे बनाऊं? उन विधियों को वापस कैसे प्राप्त करें वर्तमान प्लेटफॉर्म के वर्तमान "android.jar" संदर्भ को बदलने के लिए आपको अपने कस्टमाइज्ड एक के साथ बदलना होगा, फिर कई जावा 7 एपीआई उपलब्ध हो जाएंगे (प्रक्रिया एक्लिप्स में समान है। प्रोजेक्ट स्ट्रक्चर की जांच करें – एसडीके।)

ऑटोक्लोसेबल के अतिरिक्त, (केवल) निम्न जावा 7 पुस्तकालय सुविधाएं भी प्रकट होती हैं:

  • ConcurrentModificationException, LinkageError और AssertionError में कन्स्ट्रक्शंस को अवरुद्ध करना अपवाद
  • प्राइमिटिव के लिए स्थैतिक। कॉम्परे () विधियां: बूलियन कॉमपैर (), बाइट कॉपरे (), शॉर्टकॉप (), कैरेक्टर डिपरे (), इंटिजर कॉपरे (), लांग कॉपरे ()।
  • मुद्रा : .गेटअवलब्धमुरे (), .getDisplayName () (लेकिन बिना .getNumericCode ())
  • बिटसेट : .previousSetBit (), .previousClearBit (), .valueOf (), .toLongArray (), .toByteArray ()
  • संग्रह : .emptyEnumeration (), .emptyIterator (), .emptyListIterator ()
  • AutoCloseable
  • थ्रोएबल : .addSuppressed (), .getSuppressed (), और 4-तर्क निर्माता
  • चरित्र : .compare (), .isSurrogate (), .getName (),। हाउस्राग्रेट (), .lowSurrogate (), .isBmpCodePoint () (लेकिन बिना .islphabetic () और .isIdeographic ())
  • सिस्टम:। लाइनसिपारेटर () (undocumented?)
  • java.lang.reflect.Modifier : .classModifiers (), .constructorModifiers (), .fieldModifiers (), .interfaceModifiers (), .methodModifiers ()
  • नेटवर्क इंटरफेस : .getIndex (), .getByIndex ()
  • InetSocketAddress : .getHostString ()
  • InetAddress : .getLoopbackAddress ()
  • लकड़हारा : .getGlobal ()
  • ConcurrentLinkedDeque
  • सारक्यूटेड सिंक्रोनाइज़र: .hasQueuedPreEcessors ()
  • डिफ्लेटर आउटपुट स्ट्रीम: "सिंकफ्लूश" के साथ 3 कंस्ट्रक्टर
  • डिफ्लेटर: .NO_FLUSH, .SYNC_FLUSH, .FULL_FLUSH, .deflate () 4 तर्कों के साथ

वह मूल रूप से सभी है विशेष रूप से, NIO 2.0 मौजूद नहीं है, और arrays.asList अभी भी @SafeVarargs नहीं है।

संपादित करें: उस समय यह लिखा गया था, नवीनतम रिलीज एंड्रॉइड 9 और एलेप्से इंडिगो था बात तब से बदल गई है

  • व्यावहारिक जवाब

हां, मैंने कोशिश की है लेकिन यह एक महान परीक्षण नहीं है क्योंकि संगतता स्तर 6 तक सीमित नहीं है (कम से कम कोई आसान तरीका नहीं) वास्तव में जावा 7 का उपयोग करने के लिए:

  • पहले मैंने एक जेडीके 7 को एक मशीन पर स्थापित किया था, जिसमें कोई अन्य जेडीके स्थापित नहीं था – एक्लिप्स और एंड्रॉइड स्थापित नहीं हैं:

7 ही इस मशीन पर स्थापित है

  • फिर मैंने एक नया ईक्लीपसी इंडिगो स्थापित किया और जाँच कर लिया कि यह वास्तव में जेडीके 7 का उपयोग कर रहा था (ठीक है, क्योंकि यह केवल एक है और जैसा कि मैंने चुना है वो मुझे हैरान होता है)

यह 7 केवल इस ग्रहण द्वारा उपयोग किया जाता है

  • फिर मैंने एंड्रॉइड एसडीके का नवीनतम संस्करण स्थापित किया (संपादित करें: हनीकॉब, एपीआई 13, जिस समय इस पोस्ट को लिखा गया था)। यह मेरा जेडीके 7 पाया और ठीक से स्थापित किया। एडीटी के लिए एक ही है

  • लेकिन एक हैलो वर्ड एंड्रॉइड ऐप को संकलन और चलाने की कोशिश करते समय मुझे आश्चर्यचकित किया गया था। जावा 7 को मजबूर करने के लिए संगतता जावा 6 पर सेट की गई थी:

संगतता जावा 6 तक ही सीमित है

  • मैंने एक गैर-एंड्रॉइड प्रोजेक्ट, एक नियमित जावा एक के साथ कोशिश की और मुझे स्पष्टीकरण दिया गया। संगतता का स्तर ईक्लिप्स द्वारा सीमित लगता है (निम्न चित्र के नीचे संदेश देखें):

ग्रहण स्तर 6 अनुकूलता के लिए खुद को सीमित करता है

इसलिए मैंने नमस्ते विश्व में काम किया है, और अन्य एप्लिकेशन, अधिक जटिल और SQLite , Listview , Sensor और Camera का उपयोग करते हुए, लेकिन यह केवल साबित करता है कि जावा 7 की संगतता प्रबंधन अच्छी तरह से और एंड्रॉइड के साथ काम करने लगता है।

तो, क्या कोई अच्छे पुराने चींटी के साथ कोशिश करता है, जो ऊपर देखा गया ग्रहण सीमा को बाईपास करता है?

  • Theroetical जवाब

वैसे भी, एसडीके जावा 5 या 6 के साथ प्रयोग करने के लिए डिज़ाइन किया गया है, जैसा कि यहां बताया गया है

हम कुछ जावा 7 के साथ काम कर सकते हैं, लेकिन यह "दुर्घटना से" काम करेगा डीईएक्स का निर्माण ठीक से या नहीं हो सकता है, और डीईएक्स की स्थापना के बाद, यह काम कर सकता है या नहीं। यह इसलिए कि एक गैर-योग्य जेडीके का उपयोग परिभाषा के द्वारा अप्रत्याशित परिणाम देता है।

यहां तक ​​कि अगर किसी ने सादे जावा 7 के तहत एक एंड्रॉइड ऐप को सफलतापूर्वक बनाया है, तो यह जेडीके योग्य नहीं है। दूसरी प्रक्रिया पर लागू होने वाली एक ही प्रक्रिया असफल हो सकती है, या परिणामी एप्लिकेशन में जेडीके के इस्तेमाल से बग्स हो सकते हैं। सिफारिश नहीं की गई।

उन लोगों के लिए जो वेबएप विकास में शामिल होते हैं, यह वास्तव में जावा 5 या 6 के तहत जावा 4 या 6 के तहत बनाया गया एक वेब एप्लीकेशन की तैनाती के समान है (उदाहरण के लिए वेबलॉगिक 8 का कहना है)। यह काम कर सकता है, लेकिन ऐसा कुछ ऐसा नहीं है जिसे प्रयोजनों के लिए अन्य उद्देश्यों के लिए अनुशंसित किया जा सकता है।

Dalvikvm.com से उद्धरण:

डीएसएक्स, एंड्रॉइड एसडीके में शामिल है, जावा क्लास के जावा कक्षा फ़ाइलों को एक नियमित जावा कम्पाइलर द्वारा दूसरे वर्ग फ़ाइल स्वरूप (.dex प्रारूप) में संकलित करता है।

इसका अर्थ है, .java स्रोत फ़ाइल कोई फर्क नहीं पड़ता, यह केवल .class bytecode है

जहां तक ​​मुझे पता है, केवल 7 में जेवीएम बाइटकोड में केवल इनोकैक्शननामिक को जोड़ा गया था, शेष 6 जावा के साथ संगत है। जावा भाषा ही इनवॉकैमेनामेक का उपयोग नहीं करती हैस्ट्रिंग एस या मल्टी- कैच का इस्तेमाल करते हुए स्विच स्टेटमेंट जैसी अन्य नई सुविधाएं सिर्फ सिंटेक्टिक चीनी हैं और बाइट कोड परिवर्तन की आवश्यकता नहीं थी। उदाहरण के लिए, बहु- पकड़ केवल प्रत्येक संभावित अपवाद के लिए कैच -ब्लॉक को कॉपी करता है

एकमात्र समस्या यह होनी चाहिए कि जावा 7 में पेश किए गए नए कक्षाएं एंड्रॉइड में गायब हो रही हैं, जैसे ऑटोक्लेसेबल , इसलिए मुझे यकीन नहीं है कि आप कोशिश -के-संसाधन-सुविधा का उपयोग कर सकते हैं (किसी ने इसे करने की कोशिश की?)।

उस पर कोई टिप्पणी? क्या मैं कुछ भूल रहा हूँ?

एंड्रॉइड एसडीके v15 के रूप में, ग्रहण 3.7.1 के साथ, जावा 7 एंड्रॉइड डेवलपमेंट के लिए समर्थित नहीं है । स्रोत अनुकूलता को 1.7 मानेदेश के लिए सेट करना, जनरेट किया गया क्लास फ़ाइल संगतता 1.7 को सेट करने से एंड्रॉइड कंपाइलर द्वारा निम्न त्रुटि की ओर जाता है:

Android को संकलक अनुपालन स्तर 5.0 या 6.0 की आवश्यकता है इसके बजाय '1.7' मिला कृपया एंड्रॉइड उपकरण> फिक्स प्रोजेक्ट गुणों का उपयोग करें

@ केनीटीएम द्वारा उपर्युक्त उत्तर पर विस्तार करने के लिए, यदि आप 4.0.3 और इसके बाद के संस्करण ( minSdkVersion = 15 ) को लक्षित कर रहे हैं, तो आप अपने लक्ष्य एसडीके एंड्रॉइड। जेयर में कुछ कक्षाएं जोड़कर छिपी एपीआई का उपयोग कर सकते हैं।

एक बार जब आप ऐसा करते हैं, तो आप किसी भी Closeable पर प्रयास-के-साथ संसाधनों का उपयोग कर सकते हैं, साथ ही साथ स्वयं कक्षाओं में स्वत: सक्षम भी कर सकते हैं।

मैंने इन एपीआई को उपलब्ध कराने के लिए एंड्रॉइड.जर में संशोधित किए जाने वाले सभी वर्गों के सूत्रों और बायनेरिज़ को एक ज़िप बनाया है। आपको बस इसे खोलना और अपने बायनेरिज़ को जोड़ने की आवश्यकता है
Android-SDK / प्लेटफार्मों / android-एनएन / android.jar

आप इसे यहां से डाउनलोड कर सकते हैं: http://db.tt/kLxAYWbr

इसके अलावा नोट यह है कि, पिछले कुछ महीनों में, इलियट ह्यूजेस ने एंड्रॉइड ट्री में कुछ कमाई की है: ऑटोक्लेसेबल बंद , सेफ वर्गार्ज़ , अनारक्षित विभिन्न एपीआई , फिक्स्ड थ्रोएबल संरक्षित कन्स्ट्रक्टर और वर्जन 51 क्लास फाइलों के लिए डीएक्स । इसलिए, अंत में कुछ प्रगति चल रही है

संपादित करें (अप्रैल 2014):

एसडीके 1 की रिहाई के साथ यह अतिरिक्त एपीआई के साथ android.jar पैच करने के लिए अब जरूरी नहीं है।

4.0.3 और उससे अधिक ( minSdkVersion = 15 ) को लक्षित करने वाले ऐप के लिए एंड्रॉइड स्टूडियो में प्रयास-के-संसाधनों का उपयोग करने का सबसे अच्छा तरीका निम्न compileOptions को अपने build.gradle :

 android { compileSdkVersion 19 buildToolsVersion '19.0.3' defaultConfig { minSdkVersion 15 targetSdkVersion 19 } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } 

एंड्रॉइड स्टूडियो शिकायत करेगा कि इस एपीआई स्तर के साथ-साथ संसाधनों का उपयोग नहीं किया जा सकता, लेकिन मेरा अनुभव यह है कि यह कर सकते हैं। यह परियोजना 4.0.3 या इसके बाद के संस्करण वाले उपकरणों पर बिना किसी समस्या के निर्माण और चलाएगी। मैंने 500k + उपकरणों में इंस्टॉल किए गए ऐप के साथ इस पर कोई समस्या नहीं देखी है।

एंड्रॉइड स्टूडियो त्रुटि

इस चेतावनी को अनदेखा करने के लिए, अपने lint.xml को निम्न जोड़ें:

 <issue id="NewApi"> <ignore regexp="Try-with-resources requires API level 19"/> </issue> 

ऐसा प्रतीत होता है कि यह शुद्ध चींटी के साथ काम करने के लिए एक कलह का थोड़ा सा है।

लेकिन यह मेरे लिए काम किया है: http://www.informit.com/articles/article.aspx?p=1966024

Android की एंट आधारित बिल्ड सिस्टम द्वारा कोड निर्माण में जावा 7 सुविधाओं का उपयोग करने के लिए, अपनी प्रोजेक्ट रूट निर्देशिका में बस अपने custom_rules.xml में निम्न डाल custom_rules.xml :

custom_rules.xml:

 <project name="custom_android_rules"> <property name="java.target" value="1.7" /> <property name="java.source" value="1.7" /> </project> 

कुछ लोग इस जीआईटी परियोजना में मुझे दिलचस्पी ले सकते हैं, जो कि जावा 7 को एंड्रॉइड पर चलाने की अनुमति देता है। https://github.com/yareally/Java7-on-Android

हालांकि यदि मैं मौजूदा परियोजना में इसे जोड़ता हूं तो इससे ज्यादा जोखिम मैं काम करता हूं। इसलिए मैं आधिकारिक रूप से जावा 7 का समर्थन करने के लिए Google तक प्रतीक्षा करूँगा।