2011-12-01 81 views
1

背移植一個應用程序到Android 1.5,我解決的VerifyError錯誤所有的時間,但這裏是一個比平常明顯少得多(full log here):的VerifyError的「訪問」

W/dalvikvm(6978): VFY: invalid reg type 8 on iput instr (need 6) 
W/dalvikvm(6978): VFY: rejecting opcode 0x5c at 0x0004 
W/dalvikvm(6978): VFY: rejected Lcom/ichi2/anki/CardEditor;.access$1776 (Lcom/ichi2/anki/CardEditor;I)Z 
W/dalvikvm(6978): Verifier rejected class Lcom/ichi2/anki/CardEditor; 
W/dalvikvm(6978): Class init failed in newInstance call (Lcom/ichi2/anki/CardEditor;) 
D/AndroidRuntime(6978): Shutting down VM 
W/dalvikvm(6978): threadid=3: thread exiting with uncaught exception (group=0x4000fe70) 
E/AndroidRuntime(6978): Uncaught handler: thread main exiting due to uncaught exception 
E/AndroidRuntime(6978): java.lang.VerifyError: com.ichi2.anki.CardEditor 
E/AndroidRuntime(6978): at java.lang.Class.newInstanceImpl(Native Method) 

有趣線似乎是:rejected Lcom/ichi2/anki/CardEditor;.access

莫明其妙的事是,有在CardEditor類也不是它的父類Activity沒有access方法,在公共API的任何水平。非API Android源代碼實際上包含ActivityThread.access,但我只使用公共API。

這個CardEditor類不會導入任何編譯的庫(jar或so)。導入語句是「android」。或者引用同一項目中的Java源文件,從而在同一時間重新編譯。如果這很重要,下面是我總是編譯的:ant clean debug,這是由Android SDK自動創建的新鮮Ant文件。

回答

3

您可能會遇到Dalvik限制。方法不能產生超過65535個字節碼。嘗試發現CardEditor中最大的方法並將它們分成塊。例如,通過調用其他方法而不是直接在每個「case」之後編碼,然後查看是否有效。

請看看this link

+0

最長的方法有252行。我將交換機的每個「case」分成不同的私有方法,現在它工作,不再有VerifyError :-)非常感謝! –