2013-01-17 29 views
12

का उपयोग कर जब मैं java.lang.NoClassDefFoundError मिलती है: com.facebook.android.R $ लेआउट त्रुटि जब मैं करने के लिए अपने प्रोजेक्ट लिंक facebookSDK जार फ़ाइल जिसे मैंने अपने प्रोजेक्ट lib में जोड़ा है, मेरे प्रोजेक्ट को फेसबुकस्डैक लाइब्रेरी प्रोजेक्ट में मेरे वर्कस्पेस में जोड़ने के बजाय। जब मैं वर्कस्पेस में लाइब्रेरी प्रोजेक्ट से लिंक करता हूं तो यह ठीक काम करता है।

क्या कोई मुझे बता सकता है कि इस समस्या को कैसे हल किया जाए। मैं एंड्रॉइड के लिए फेसबुक एसडीके 3.0 का उपयोग कर रहा हूँ। अग्रिम में धन्यवाद।

संपादित करें: चेतावनी के साथ जार फ़ाइल पैदा करने के बाद मैं अपने logcat

01-17 12:42:04.790: E/AndroidRuntime(3073): FATAL EXCEPTION: main 
01-17 12:42:04.790: E/AndroidRuntime(3073): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.games.game/com.facebook.LoginActivity}: android.content.res.Resources$NotFoundException: File 296108030489520 from xml type layout resource ID #0x7f030001 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1816) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.app.ActivityThread.access$1500(ActivityThread.java:132) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.os.Looper.loop(Looper.java:143) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.app.ActivityThread.main(ActivityThread.java:4196) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at java.lang.reflect.Method.invoke(Method.java:507) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at dalvik.system.NativeStart.main(Native Method) 
01-17 12:42:04.790: E/AndroidRuntime(3073): Caused by: android.content.res.Resources$NotFoundException: File 296108030489520 from xml type layout resource ID #0x7f030001 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.content.res.Resources.loadXmlResourceParser(Resources.java:1934) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.content.res.Resources.loadXmlResourceParser(Resources.java:1889) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.content.res.Resources.getLayout(Resources.java:740) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.view.LayoutInflater.inflate(LayoutInflater.java:318) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:224) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.app.Activity.setContentView(Activity.java:1702) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at com.facebook.LoginActivity.onCreate(LoginActivity.java:55) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  ... 11 more 
01-17 12:42:04.790: E/AndroidRuntime(3073): Caused by: java.io.FileNotFoundException: 296108030489520 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.content.res.AssetManager.openXmlAssetNative(Native Method) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:524) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  at android.content.res.Resources.loadXmlResourceParser(Resources.java:1916) 
01-17 12:42:04.790: E/AndroidRuntime(3073):  ... 20 more 
+0

अपने जार को lib के बजाय libs फ़ोल्डर में कॉपी करने का प्रयास करें। –

+0

यह मुद्दा नहीं है। – glo

+4

एसडीके के 3.0 संस्करण में अब विचार शामिल हैं (जैसे लॉगबटन, फ्रेंडपीकर, आदि) जिसमें संसाधन फाइलें शामिल हैं। इसका मतलब है कि एसडीके को अब एक जार फ़ाइल के रूप में शामिल नहीं किया जा सकता है, लेकिन इसे एंड्रॉइड लाइब्रेरी के रूप में शामिल किया जाना चाहिए। क्षमा करें, लेकिन यह मानक एंड्रॉइड बिल्ड सिस्टम की एक सीमा है। –

उत्तर

2

में निम्न त्रुटि मिला इसका मतलब है कि आपके JAR फ़ाइल सभी वर्ग फ़ाइलों जरूरत नहीं है।

NoClassDefFoundError प्रकट होता है केवल जब यह जावा वर्ग की .class फ़ाइल खोजने के लिए विफल रहता है।

कक्षा फ़ाइल मौजूद नहीं है क्योंकि आप उस वर्ग से किसी भी फ़ंक्शन या चर तक पहुंच नहीं सकते हैं।

इस समस्या को हल करने के लिए,

n ग्रहण जब आप जार फ़ाइल यह केवल वर्ग है जो, किसी भी त्रुटि या warnings.So नहीं है चेतावनी आप की जरूरत सहित सभी वर्गों के साथ जार फ़ाइल उत्पन्न करने के लिए भी शामिल है निर्यात चुनने के लिए चेतावनी के साथ जार उत्पन्न करें।

फिर बजाय फ़ोल्डर lib फ़ोल्डर libs में इस जार फ़ाइल डाल दिया।

फिर इस जार को अपने निर्माण पथ में जोड़ें।

आप संसाधनों आयात करना चाहते हैं के रूप में,

के बाद से एंड्रॉयड/रेस फ़ोल्डर के अंतर्गत संसाधनों फाइलों के साथ स्वचालित रूप से आर वर्ग में आता है, अनुसंधान वर्ग का उपयोग कर के रूप में अंतिम स्थिर असंभव है।

आपके स्रोत कोड में जो जार फ़ाइल में निर्यात किया जाएगा, आर चर का उपयोग न करें क्योंकि इसे संकलित समय में अंतिम स्थिर स्मृति पते के साथ प्रतिस्थापित किया जाएगा। आर का उपयोग करने के बजाय, नीचे विधि का उपयोग करें।

public static int getResourseIdByName(String packageName, String className, String name) { 
     Class r = null; 
     int id = 0; 
    try { 
     r = Class.forName(packageName + ".R"); 

     Class[] classes = r.getClasses(); 
     Class desireClass = null; 

     for (int i = 0; i < classes.length; i++) { 
      if(classes[i].getName().split("\\$")[1].equals(className)) { 
       desireClass = classes[i]; 

       break; 
      } 
     } 

     if(desireClass != null) 
      id = desireClass.getField(name).getInt(desireClass); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 

    return id; 

    } 

उदाहरण के लिए, यदि आप "main.xml" नामक एक लेआउट है, तो आप इसे बुला विधि

int id = getResourceIdByName(context.getPackageName(), "layout", "main"); 

से मिलता है और कर सकते हैं आप एक स्ट्रिंग जिसका आईडी "टेक्स्ट 1" है है, तो आप विधि

int id = getResourceIdByName(context.getPackageName(), "string", "text1"); 

यह विधि आपको रनटाइम में अपना संसाधन आईडी देता है। यह रनटाइम में आर की स्थिति प्राप्त करने के लिए प्रतिबिंब एपीआई का उपयोग करता है।

तो अब आप इस परियोजना को लक्षित करने के लिए इस विधि का

अपने रेस नकल का उपयोग करके आर चर और संसाधनों का उपयोग कर ewrrors बच सकते हैं।

और आखिरकार अपनी परियोजना चलाएं।

+0

मुझे अपने फेसबुक एसडीके लाइब्रेरी में कोई त्रुटि या चेतावनियां नहीं दिख रही हैं bi = ut अभी भी मैं चेतावनी के साथ जार कैसे उत्पन्न कर सकता हूं। – glo

+0

प्रोजेक्ट-> निर्यात जार-> अगली-> निर्यात जार फ़ाइल संकलन चेतावनी के साथ दायाँ क्लिक करें – dd619

+0

** एपीके के लिए डुप्लिकेट फ़ाइल मिली: bin/AndroidManifest.xml ** मुझे यह त्रुटि मिल रही है जब भी मैं AndroidManifest.xml – glo

8

ऐसा इसलिए है क्योंकि जेएआर के अंदर फेसबुक एसडीके परियोजना का संसाधन फ़ोल्डर नहीं है।

  1. एक परियोजना पुस्तकालय के रूप में फेसबुक एसडीके परियोजना जोड़ें:

    इस के लिए 2 समाधान वहाँ रहे हैं।

  2. वर्तमान परियोजनाओं के फ़ोल्डर libs के लिए फेसबुक एसडीके जेएआर फ़ाइल कॉपी करें और फेसबुक एसडीके परियोजना से वर्तमान संसाधनों के सभी संसाधनों की प्रतिलिपि बनाएँ।

+0

यह एक सुंदर समाधान कैसा है? –

+0

कृपया, ग्रहण का उपयोग कर समाधान 1 को कैसे कार्यान्वित करें? –