2011-02-24 10 views
9

मैं एक ऐसी परियोजना पर काम कर रहा हूं जो बाहरी पुस्तकालय को DexClassLoader के माध्यम से लोड करने का प्रयास करता है। यह 2.3 में बहुत अच्छी तरह से काम किया:एंड्रॉइड हनीकॉम पर DexClassLoader

02-23 09:30:58.221: ERROR/dalvikvm(8022): Can't open dex cache '/data/ 
dalvik-cache/ 
[email protected]@[email protected]@[email protected]': 
No such file or directory 
02-23 09:30:58.221: INFO/dalvikvm(8022): Unable to open or create 
cache for /data/data/at.mSystem.client/files/ 
mSystem_Client_FormularLibrary.jar (/data/dalvik-cache/ 
[email protected]@[email protected]@[email protected]) 
02-23 09:30:58.231: WARN/System.err(8022): 
java.lang.ClassNotFoundException: 
at.mSystem.client.formular.contract.ContractListFormularDisplay in 
loader [email protected] 
02-23 09:30:58.241: WARN/System.err(8022):  at 
dalvik.system.DexClassLoader.findClass(DexClassLoader.java:240) 
02-23 09:30:58.241: WARN/System.err(8022):  at 
java.lang.ClassLoader.loadClass(ClassLoader.java:548) 
02-23 09:30:58.261: WARN/System.err(8022):  at 
java.lang.ClassLoader.loadClass(ClassLoader.java:508) 
02-23 09:30:58.261: WARN/System.err(8022):  at 
at.mSystem.client.system.formularmodule.formular.FormularDisplayLoader.getDisplay(FormularDisplayLoader.java: 
35) 

: दुर्भाग्य से

public class FormularDisplayLoader { 
public final static String PATH ="/data/data/at.mSystem.client/files/mSystem_Client_FormularLibrary.jar"; 
     private DexClassLoader classLoader; 

      public FormularDisplayLoader(Context context){ 
        this.context = context; 
        this.classLoader = new DexClassLoader("/data/data/at.mSystem.client/ 
    files/mSystem_Client_FormularLibrary.jar", 
         context.getFilesDir().getAbsolutePath(), 
         null, 
         FormularDisplayLoader.class.getClassLoader()); 
      } 

      public View getDisplay(String className) throws ErrorCodeException{ 
        try { 
          Class c = classLoader.loadClass(className); 
          Method m = c.getMethod("getDisplay", Context.class); 
          View ret = (View) m.invoke(c.newInstance(), context); 
          return ret; 
        } catch (Exception e) { 
          e.printStackTrace(); 
          throw new 
    ErrorCodeException(FormularErrorCode.NO_DISPLAY_AVAILABLE_FOR_FORMULAR); 
        } 
      } 

    } 

, जब बंदरगाह के लिए हनीकोम्ब के लिए इस एप्लिकेशन की कोशिश कर रहा है (क्योंकि इस एप्लिकेशन के लिए वास्तविक लक्ष्य गोलियाँ कर रहे हैं) DexClassLoader एक अपवाद फेंकता ऐसा लगता है कि DexClassLoader 212 पैरामीटर (dexOutputDir) को संदर्भ.getFilesDir() के मान के रूप में अनदेखा करता है। मेरे उदाहरण में getAbsolutePath() प्राप्त करें "/ data/data/ at.mSystem.client/files"।

क्या आपके पास कोई उपाय है कि इसे कैसे हल किया जाए? या यह किसी प्रकार का हनीकॉम बग है?

धन्यवाद,

रोलाण्ड

+0

मेरे पास कोई जवाब नहीं है, लेकिन सिर्फ आपको यह बताना चाहता था कि मुझे एक ही समस्या का सामना करना पड़ रहा है। – gotosleep

+0

मैंने एंड्रॉइड के इश्यू ट्रैकर पर टिकट खोला: http://code.google.com/p/android/issues/detail?id=15893 – gotosleep

+0

उसी दिन आपने इसे दायर किया, Google के किसी ने कहा "हाँ, आंतरिक बग 3439372. अनुसूचित हनीकॉम की आगामी रखरखाव रिलीज के लिए " –

उत्तर

2

परिवर्तन इतिहास को देखते हुए, इस Android 3.1 में तय किया जाना चाहिए।

3

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मुझे हाल ही में एंड्रॉइड 3.1 के उन्नयन किए बिना इसका उत्तर चाहिए, इसलिए मैंने सोचा कि मैं अपना समाधान साझा करूंगा।

मैंने "DexClassLoader" के बजाय "DexFile" वर्ग का उपयोग किया, क्योंकि इससे मुझे आउटपुट फ़ाइल पास करने की इजाजत मिली, इस प्रकार आउटपुट निर्देशिका को अनदेखा कर दिया गया।

final File dexClasses = new File("/sdcard/dexcontainer.zip"); 
DexFile dexFile = DexFile.loadDex(dexClasses.getAbsolutePath(), getFilesDir().getAbsolutePath() + "/outputdexcontainer.dex", 0); 

Enumeration<String> classFileNames = dexFile.entries(); 
while (classFileNames.hasMoreElements()) 
{ 
    String className = classFileNames.nextElement(); 
    dexFile.loadClass(className, classLoader); 
} 

आशा इस कोई मदद करता है:

यहाँ मेरी कोड है।

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