我正在为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的模拟器中也失败了。
答案 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 ....