【问题标题】:NoClassDefFoundError on android - a very wierd situation?android上的NoClassDefFoundError - 一个非常奇怪的情况?
【发布时间】:2011-11-07 01:56:36
【问题描述】:

我正面临一个奇怪的情况,即该类肯定位于我的 android 应用程序的类路径中,但我不断收到 NoClassDefFoundError 异常。

我已经通过这段代码 sn-p 检查了该类确实存在:

try{
  Field dexField = PathClassLoader.class.getDeclaredField("mDexs");
  dexField.setAccessible(true);

  PathClassLoader classLoader =
   (PathClassLoader)Thread.currentThread().getContextClassLoader();
  Log.d("OUT", "Class loader" + classLoader.getClass().getName());

  DexFile[] dexs = (DexFile[]) dexField.get(classLoader);

  Log.d("OUT", "Enumerating");
  for (DexFile dex : dexs) {
    Enumeration<String> entries = dex.entries();
    while (entries.hasMoreElements()) {
     // (3) Each entry is a class name, like "foo.bar.MyClass"
     String entry = entries.nextElement();
     Log.d("OUT", "Entry: " + entry);
    }
  }
 }catch(Throwable e){
   Log.e("OUT", e.getMessage(), e);
 }
 // Here I reference to the problematic class

在设备上运行应用程序时,日志会打印类名,并在访问它时抛出 NoClassDefFoundError 错误。

我迷路了。

有什么建议吗?我将不胜感激。谢谢。

【问题讨论】:

    标签: android classpath noclassdeffounderror


    【解决方案1】:

    您需要了解,至少在规范的 Java 中,“NoClassDefFoundError”并不意味着在类路径中找不到命名的 .class 文件。相反,在它被定位后,一些问题阻止了类的加载。

    造成这种情况的两个常见原因是命名问题(类在类路径结构中的错误位置,相对于其内部声明的包名称,或者只是错误命名),或者加载执行验证所需的其他类的问题命名的类。有时问题是由于类的静态初始化程序中的异常造成的。

    【讨论】:

    • 刚刚找到原因。我有两个项目,一个是从主项目引用的库项目。尽管库项目具有所有需要的 jar 文件并且编译没有错误,但即使 eclipse 明确设置为导出所有资源,jar 文件也不会导出到 apk 文件中。所以我必须在主应用程序中包含 jar 文件,并将 jar 包含在类路径中。我认为从逻辑上讲,所有依赖的 jar 都应该从库应用程序移植到主应用程序中,但显然情况并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多