Android Honeycomb上的DexClassLoader

我正在尝试通过DexClassLoader加载外部库的项目。 这在2.3中工作得很好:

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引发exception:

 02-23 09:30:58.221: ERROR/dalvikvm(8022): Can't open dex cache '/data/ dalvik-cache/ data@d...@at.mSystem.client@files@mSystem_Client_FormularLibrary....@classes.dex': 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/ data@d...@at.mSystem.client@files@mSystem_Client_FormularLibrary....@classes.dex) 02-23 09:30:58.231: WARN/System.err(8022): java.lang.ClassNotFoundException: at.mSystem.client.formular.contract.ContractListFormularDisplay in loader dalvik.system.DexClassLoader@40630308 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) 

看起来DexClassLoader忽略了第二个参数(dexOutputDir),因为在我的例子中context.getFilesDir()。getAbsolutePath()的值是“/ data / data / at.mSystem.client / files”。

你有什么想法如何解决? 或者这是一种蜂窝错误?

谢谢,

罗兰

Solutions Collecting From Web of "Android Honeycomb上的DexClassLoader"

我知道这是一个旧的post,但我最近需要一个答案,而不升级到Android 3.1,所以我想我会分享我的解决scheme。

我使用“DexFile”类而不是“DexClassLoader”,因为它允许我传递输出文件,从而解决了输出目录被忽略的问题。

这是我的代码:

 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); } 

希望这有助于某人。

看着变化的历史,这应该在Android 3.1中解决。