2011-11-07 73 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應該從庫應用移植到主應用中,但顯然情況並非如此。 –