gpt4 book ai didi

android - Android Honeycomb 上的 DexClassLoader

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:02 29 4
gpt4 key购买 nike

我正在做一个试图通过加载外部库的项目Dex类加载器。这在 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);
}
}

}

不幸的是,在尝试将此应用程序移植到 Honeycomb 时(因为这个应用程序的实际目标是平板电脑) DexClassLoader 抛出一个异常:

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/文件”。

你有什么解决办法吗?或者这是某种蜂窝虫?

谢谢,

罗兰

最佳答案

我知道这是一篇旧帖子,但我最近需要在不升级到 Android 3.1 的情况下解决这个问题,所以我想我会分享我的解决方案。

我使用了“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 - Android Honeycomb 上的 DexClassLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5104823/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com