2

我正在尝试从放置在 sdcard 上的外部 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 目录,但它是空的。

请帮忙!!!

4

2 回答 2

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 中使用它吗?谢谢!

于 2014-12-11T12:21:53.477 回答
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

于 2019-01-17T10:16:40.797 回答