2015-08-13 9 views
7

मैं CaptureActivity class में RESULT_DISPLAY_DURATION_MS के लिए बारकोड स्कैनर प्लगइन की जार फ़ाइल में कुछ बदलना चाहता हूं।जार में कक्षा संशोधित करें: एंड्रॉइड बिल्ड विफल

मैंने इसे टर्मिनल (मैं मैक पर हूं) का उपयोग करके इसे अनजिप कर दिया।

फिर, ClassEditor का उपयोग करके, मैंने क्लास कैप्चर एक्टिविटी को देखा, और मान बदल दिया। अगला, मैंने इसे jar cfv samenameasoriginal.jar * का उपयोग करके पुनः संग्रहीत किया। फिर, मैंने मूल जार-फ़ाइल को नए के लिए बदल दिया।

समस्या यह है, जब मैं यह ईओण का उपयोग कर बनाने की कोशिश, मैं त्रुटियों की एक लंबी सूची हो, युक्त

अप्रत्याशित शीर्ष-स्तर अपवाद: com.android.dx.cf.iface। ParseException: खराब विशेषता लंबाई; उम्मीद लंबाई 00000002 ... ... पार्स करने के दौरान com/गूगल/ZXing/ग्राहक/एंड्रॉयड/CaptureActivity.class

मैंने देखा है कि नए जार फ़ाइल 7 केबी मूल एक से बड़ा है , हालांकि मैंने केवल 1500 से 9500 की संख्या बदल दी है, इसलिए यह थोड़ा अजीब है।

कोई भी जो मेरी मदद कर सकता है? ऑनलाइन देखा लेकिन कुछ भी ...

+0

आप ऐसा क्यों करना चाहते हैं? –

+0

जब बारकोड स्कैनर एक कोड स्कैन करता है, तो यह एक संदेश दिखाता है जैसे "यूआरएल मिला" या "पाठ मिला" थोड़ा कम 2 सेकंड के लिए। मैं इस देरी को खत्म करना चाहता हूं क्योंकि मेरे ऐप में यह कुंजी है कि स्कैनिंग तेज है। मैंने पहली बार प्लगइन की .java फ़ाइलों को बदलने की कोशिश की, लेकिन मुझे और कुछ नहीं मिला: http://stackoverflow.com/questions/31965298/ionic-cordova-plugin-not-updating – binoculars

+0

आप विस्तार क्यों नहीं करते वे कक्षाएं जिनका आप उपयोग कर रहे हैं और अपना कोड बदल सकते हैं? व्यवहार? जब आप ओओपी का उपयोग कर सकते हैं तो जार क्यों हैक? –

उत्तर

1

वर्ग से बढ़ाएँ और मान समायोजित पाया: इसके बजाय CaptureActivity अब उपयोगकर्ता अपने कस्टम वर्ग को बुलाने की

public class CustomCaptureActivity extends CaptureActivity { 

    RESULT_DISPLAY_DURATION_MS = 9500; // wheras 9500 is your custom value 
} 

यदि RESULT_DISPLAY_DURATION_MS केवल पढ़ने के लिए है: & इस चर का उपयोग करके अपने कस्टम वर्ग में विधियों को पेस्ट करें और चर को अपनी कक्षा में परिभाषित एक नई स्थिरता के साथ प्रतिस्थापित करें। CaptureActivityfinal नहीं है, यह उम्मीद है कि यह आपके लिए चाल है।

0

सही उत्तर यह है कि आपकी कुछ जार फ़ाइलें संकलित नहीं होती हैं। आपको अपने प्रोजेक्ट में अपने बिल्ड पथ (सभी आश्रित पथ सेट करें) फ़ाइल में जाना चाहिए, और अपनी निर्भरताओं को देखें।

यदि आप बस कुछ जार फ़ाइलों को आयात कर रहे हैं, तो आप उन्हें हटाने और उन्हें एक समय में जोड़ने का प्रयास कर सकते हैं। यह आपको यह निर्धारित करने में मदद करेगा कि उनमें से कौन सा त्रुटि का कारण बनता है।

मेरे मामले में, मैंने बस यही किया, और जब मैं अंतिम आयात कर रहा था, तो ऐप संकलित हुआ। तो मुझे लगता है कि असली समस्या यह थी कि मैं एक बार में बहुत से आयात कर रहा था। लेकिन अब यह सब काम करता है।

1

मुझे लगता है कि समस्या यह है क्योंकि जब आप जार बना रहे हैं, तो कुछ लिंक हैं जो फ़ाइल के पुराने संस्करण (optiomination कारणों के कारण) से संबंधित हो सकता है और सब कुछ बस दुर्घटनाग्रस्त हो सकता है।

यकीन नहीं है, लेकिन मुझे लगता है कि यही कारण है।

तो, बजाय फ़ाइल बदलने की है, तो आप उपयोग कर सकते हैं या एक डेकोरेटर डिजाइन गपशप (बेहतर विचार, संभव हो तो) वर्ग है कि आप परिवर्तन (https://en.wikipedia.org/wiki/Decorator_pattern) के साथ बदलने की जरूरत है उपवर्गीकरण या आप प्रतिबिंब का उपयोग कर सकते सीधे संशोधित करने के लिए पुस्तकालय।

यहां एक निजी अंतिम क्षेत्र को बदलने का एक उदाहरण है।आप कुछ ऐसा ही कर सकते हैं:

import java.lang.reflect.*; 

public class EverythingIsTrue { 
    static void setFinalStatic(Field field, Object newValue) throws Exception { 
     field.setAccessible(true); 

     Field modifiersField = Field.class.getDeclaredField("modifiers"); 
     modifiersField.setAccessible(true); 
     modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 

     field.set(null, newValue); 
    } 

    public static void main(String args[]) throws Exception {  
     setFinalStatic(Boolean.class.getField("FALSE"), true); 

     System.out.format("Everything is %s", false); // "Everything is true" 
    } 
} 
संबंधित मुद्दे