2011-11-07 48 views
2

我面临着一个奇怪的情况,那里的类肯定是​​在我的android应用程序的类路径中,但是我一直在收到NoClassDefFoundError异常。Android上的NoClassDefFoundError - 一个非常奇怪的情况?

我已经检查了确实类通过此代码段存在:

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的错误。

我迷失在这里。

有什么建议吗?我会很感激。谢谢。

+0

堆栈跟踪/类名? –

回答

4

您需要明白,至少在规范Java中,“NoClassDefFoundError”并不意味着在classpath中找不到指定的.class文件。相反,找到它之后,有些问题阻止了类的加载。

这样做的两个常见原因是命名问题(classpath结构中错误位置的类,相对于其内部声明的包名称,或者仅仅是错误名称),或加载其他需要执行验证的类的问题命名的类。偶尔,问题是由于类的静态初始化器中的异常造成的。

+1

刚发现原因。我有两个项目,一个是从主项目引用的图书馆项目。虽然库项目具有所有需要的jar文件并且编译时没有错误,但即使将eclipse明确设置为导出所有资源,jar文件也不会被导出到apk文件中。所以我必须在主应用程序中包含jar文件,并将jar包括在classpath中。我认为从逻辑上讲,所有依赖的jar应该从库应用移植到主应用中,但显然情况并非如此。 –