我试图从放在SD卡上的外部JAR文件加载类。许多人成功使用了 DexClassLoader 。
我的步骤:
1)从jar文件中创建 classes.dex 文件:
dx --dex --output=classes.dex file.jar
2)将生成的classes.dex文件添加到jar
3)创建DexClassLoader:
ClassLoader classLoader = new DexClassLoader(context.getDir("dex",
Context.MODE_PRIVATE).getAbsolutePath(), jarfile.getAbsolutePath(), null,
context.getClassLoader());
4)当我看到dex里面的内容时:
try {
DexFile dx = DexFile.loadDex(jarFile.getAbsolutePath(), File.createTempFile("opt", "dex",
context.getCacheDir()).getPath(), 0);
// Print all classes in the DexFile
for(Enumeration<String> classNames = dx.entries(); classNames.hasMoreElements();) {
String className = classNames.nextElement();
System.out.println("class: " + className);
}
} catch (IOException e) {
e.printStackTrace();
}
DexOpt: --- BEGIN 'file.jar' (bootstrap=0) ---
DexOpt: --- END 'file.jar' (success) ---
DEX prep '/mnt/sdcard/tmp/file.jar': unzip in 0ms, rewrite 83ms
class: com.test.TestClass
5)加载类:
Class<?> class = classLoader.loadClass("com.test.TestClass");
这里我得到例外!:
java.lang.ClassNotFoundException: Didn't find class "com.test.TestClass" on path: /data/data/com.myapp/cache/app_dex
我看到它创建了app_dex目录,但它是空的。
请帮助!!!
答案 0 :(得分:2)
我可以从jar加载类的唯一方法是 DexFile 类:
DexFile dexFile = DexFile.loadDex(jar.getAbsolutePath(),
File.createTempFile("opt", "dex", context.getCacheDir()).getPath(), 0);
....
Class<?> currClass = dexFile.loadClass(className, context.getClassLoader());
非常有趣的是为什么我不能用 DexClassLoader 来做这件事。 有人在Android 4.2.2或4.4.2中使用它吗? 谢谢!
答案 1 :(得分:0)
似乎您输入的订单不正确
ClassLoader classLoader = new DexClassLoader(context.getDir("dex",
Context.MODE_PRIVATE).getAbsolutePath(), jarfile.getAbsolutePath(), null,
context.getClassLoader());
用第二个替换第一个参数
更多信息https://developer.android.com/reference/dalvik/system/DexClassLoader#public-constructors_1