【问题标题】:DexClassLoder - Didn't find class on pathDexClassLoder - 在路径上找不到类
【发布时间】:2014-12-01 12:16:15
【问题描述】:

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

请帮忙!!!

【问题讨论】:

    标签: android class jar dexclassloader


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      看来你设置的顺序不对

      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

      【讨论】:

        猜你喜欢
        • 2013-12-17
        • 2016-02-04
        • 2017-09-12
        • 2014-05-29
        • 2013-07-22
        • 1970-01-01
        • 2015-07-01
        • 2014-01-22
        相关资源
        最近更新 更多