2.2.2中的java.lang.VerifyError,但不是2.3.3

时间:2013-03-31 15:58:38

标签: android

我正在为minSDK 8和targetSDK 11构建。

<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的模拟器中也失败了。

1 个答案:

答案 0 :(得分: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 ....