2013-03-31 69 views
3

我建立了minSDK 8和targetSDK 11java.lang.VerifyError的2.2.2而不是2.3.3

<uses-sdk android:minSdkVersion="8" 
      android:targetSdkVersion="11"/> 

我得到這個logcat的:

WARN/dalvikvm(2114): VFY: rejected Lcom/examplecompany/project/TidalStreams/Data/gTidalStreamsHourlyHW;.<clinit>()V 

WARN/dalvikvm(2114): Verifier rejected class Lcom/digitaliridium/tides/TidalStreams/Data/gTidalStreamsHourlyHW; 

我有兩個慾望,以及其他幾種設備;一個運行2.2.2,一個運行2.3.3。

2.2.2,我在這條線得到一個java.lang.VerifyError

public void onCreate(){ 
    ... 

    gTidalStreamsHourlyHW.init(); 

    ... 
} 

這裏的的init()方法。這是一個非常普通的班級唯一的方法。

public static void init(){ 


    int insertPosition; 
    System.arraycopy(gTidalStreamHourlyHW1, 0, gTidalStreamHourlyHW, 0, gTidalStreamHourlyHW1.length); 

    insertPosition = gTidalStreamHourlyHW1.length; 
    System.arraycopy(gTidalStreamsHourlyHW2.gTidalStreamHourlyHW1, 0, gTidalStreamHourlyHW, insertPosition, gTidalStreamsHourlyHW2.gTidalStreamHourlyHW1.length); 

    insertPosition += gTidalStreamsHourlyHW2.gTidalStreamHourlyHW1.length; 
    System.arraycopy(gTidalStreamsHourlyHW3.gTidalStreamHourlyHW1, 0, gTidalStreamHourlyHW, insertPosition, gTidalStreamsHourlyHW3.gTidalStreamHourlyHW1.length); 

    ... 

gTidalStreamsHourlyHW是一個大型數據,大約350k。我不得不將它分成多個文件來解決Java的64k編譯單元限制。

init方法只是使用System.arraycopy()將這些多個靜態數組連接成一個。

我試過將minSDK級別降到7,但問題是一樣的。

它在運行2.2.2的模擬器中也失敗。

+0

看來,Android 2.2沒有一些方法。如果您可以爲2.2編寫解決方法 - 您可以檢查版本並運行不同的方法。 – vorrtex

+0

@vorrtex但是項目SDK被設置爲8.任何缺少的方法都會導致編譯時錯誤嗎?我也已經將SDK下降到了7,並且仍然崩潰。 – Simon

+0

arrayCopy方法應該適用於任何API。嘗試找到'init'方法的哪一行失敗。檢查所有線路是否有效,然後取消註釋某些線路並再次檢查,經過幾次迭代後,您會發現錯誤的線路。 – vorrtex

回答

3

我是一個大的Android粉絲,但有時它是站不住腳:(

有錯誤的線索,指示錯誤的擔憂靜態初始化;它是<clinit>「方法」名稱:

WARN/dalvikvm(2114): VFY: rejected Lcom/examplecompany/project/TidalStreams/Data/gTidalStreamsHourlyHW;.<clinit>()V 

這表明誤差可具有帶有static { ... }初始化塊,或一些static類成員的初始化做

我的類有一個靜態數組初始化劑:

public static shcTidalStreamPointStruct[] gTidalStreamHourlyHW1 = new shcTidalStreamPointStruct[]{ 

      new shcTidalStreamPointStruct("000A",48.766667,-10.066667,51.116667,1.316667,"89",95,0.8,0.4,125,0.9,0.4,172,0.7,0.4,216,0.7,0.4,242,0.8,0.4,261,0.9,0.4,281,0.7,0.4,305,0.7,0.4,339,0.6,0.3,14,0.6,0.3,58,0.6,0.3,71,0.7,0.3,91,0.7,0.4,"GB",0), 
      new shcTidalStreamPointStruct("000B",49.533333,-9.983333,51.116667,1.316667,"89",122,0.6,0.3,166,0.8,0.4,192,0.9,0.4,213,0.9,0.5,239,0.9,0.5,255,0.9,0.5,286,0.9,0.4,330,0.7,0.4,9,0.9,0.4,38,1,0.5,52,1.1,0.5,68,0.9,0.5,104,0.6,0.3,"GB",0), 
      new shcTidalStreamPointStruct("000C",48.898333,-9.163333,51.116667,1.316667,"89",102,0.4,0.2,118,0.6,0.3,172,0.7,0.4,197,0.7,0.4,212,0.7,0.4,250,0.7,0.4,283,0.5,0.3,321,0.3,0.2,337,0.5,0.3,13,0.7,0.4,33,0.7,0.4,54,0.5,0.3,98,0.4,0.2,"GB",0), 

有283個元素。

我只用這段代碼構建了一個測試項目,並驗證了在2.2及更低版本中,它失敗了。在2.3及以上,它的工作原理。

問題是初始化程序中的行數!我一次拿出一條線,直到我剩下197條線並且它工作正常!

因此,除了Java的64k編譯單元限制外,Android類加載器中還有一些與靜態初始化的行數/大小相關的未公開限制(或錯誤)。

解決的辦法是進一步拆分我的文件以減少行數。 Fugggllly ....