- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在做一个试图通过加载外部库的项目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/
我在网上看到一些教程,它们调用简单的方法,我只需要调用接受 Context 作为参数的方法“startDownload”。我现在称它为: Class loaded = cl.loadClass("co
我在我的 android 应用程序中使用来自 Assets 或 sdcard 的外部 jar。为此,我使用 DexClassLoader。 DexClassLoader cl = new DexCla
我正在使用 DexClassLoader 进行一些测试,看看是否可以使用新功能“更新”我的应用程序。目前我有这种测试方法,它与 testClass 一起使用并运行 test() 方法。我想知道的是,我
我在运行时使用 DexClassLoader 类从 SD 卡加载一个 jar 文件 final String libPath = Environment.getExternalStorageDir
对于一个长期的学生项目,我正在尝试开发一个带有插件的模块化应用程序。具体来说,我们会: 一个主应用程序,我们可以在其中搜索、更新、删除和运行插件。这个主应用程序还会存储一些来自插件的数据。 从带有代码
我的要求是启动一个 Activity,该 Activity 存在于 Assets 文件夹内的 aar 文件中或可能位于 SDCard 中。但我遇到了以下异常: 01-05 21:06:18.717 3
我有一个图书馆,我计划以 dex 形式使用。我想直接针对这个库进行编译,但不导出它。相反,我想将它放在我的资源中并使用类加载器实际实例化它。 这是我的图书馆: public class Foo {
所以我正在尝试加载我从我的应用程序编写的类,但我收到 ClassNotFound 异常。 类(class): public class myclass{ public String doSom
我想在我的案例 JadeAndroid.jar 中加载使用外部库编译的 Android 类(使用 dexClassLoader)。此类 (dex) 在 jar 中导出(我正在使用 ant 脚本),其中
我正在做一个试图通过加载外部库的项目Dex类加载器。这在 2.3 中运行良好: public class FormularDisplayLoader { public final static
我将一个包含 .dex 文件的 .jar 文件放入目录“/sdcard”,然后尝试分别使用 DexClassLoader 和 PathClassLoader 加载 .jar 文件中的类。他们都可以成功
我正在尝试构建一个插件系统,其中 DexClassLoader 从其他已安装的包含 fragment (我的插件)的 apk 中获取代码,并在我的主机中显示它们。这工作得很好。 我也喜欢让插件热插拔,
我正在尝试为 Android 应用程序构建一个插件架构。我有一个主机应用程序,它将检查 apk“插件”文件的目录,将它们加载到 DexClassLoader 中,并调用一个方法来获取 DerivedL
我已成功通过以下方式从 dex 文件中动态加载类 enter code here File file = getDir("dex", 0); DexClassLoader dexClassLoader
我有点碰壁了。任何帮助,将不胜感激。我有一个应用程序,我想使用 DexClassLoader 加载另一个 apk 文件。 这是我的代码: DexClassLoader dLoader = new De
对于方法: Ldalvik/system/DexClassLoader;->findClass(Ljava/lang/String;)Ljava/lang/Class; 那DexClassLoader
我正在尝试制作一个简单的 android 应用程序,它可以在运行时从 SD 卡加载 DEX 文件。 该应用程序有两个 Activity 。第一个 Activity 是一个带有按钮的简单屏幕。按下按钮时
我是一名优秀的程序员,十分优秀!