站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题MOTO E680i 加载图片报错i1=Image.createImage("/res/fly.png");

MOTO E680i 加载图片报错i1=Image.createImage("/res/fly.png");

摘要: MOTO E680i 加载图片报错i1=Image.createImage("/res/fly.png");


代码如下

package fly;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class Fly extends MIDlet
{
public Display d;

public Fly(){}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}

protected void pauseApp(){}

protected void startApp() throws MIDletStateChangeException
{
d=Display.getDisplay(this);
Image i1=null;

try
{
i1=Image.createImage("/res/fly.png"); //此行有错
}
catch(Exception e)
{
e.printStackTrace();
}
}
}


开发环境:Eclipse+jdk1.5+MOTO提供的eclipseME插件。模拟器正常。E680支持的是MIDP2.0,CLDC-1.1

描述:i1=Image.createImage("/res/fly.png"); 一行注释掉就通过,没有问题,不报错。
如果不注释,在ECLIPSE中运行成功,在真机上可安装,运行的话一运行就结束了。

应该不是图片或者路径的问题,因为i1=Image.createImage(100,100);也会报错。

MOTO的文档中的Image类也提供了 Image.createImage(String path) 方法。


救命啊 着要怎么办?


MOTO模拟器的报错信息:
Error verifying method fly/Fly startApp()V
Approximate bytecode offset 10: Inconsistent or missing stackmap at target
Method............: 5d58a8 'com/sun/midp/midlet/MIDletState.createMIDlet (static
)'
Stack Chunk.......: 1abf5a8
Frame Pointer.....: 1abf64c
Current IP........: 57fbc4 = 57fbb6 + offset 14
Previous Frame....: 1abf614
Previous IP.......: 566538 (offset 52)
Frame size........: 7 (1 arguments, 6 local variables)
Argument[0].......: 1abde84
Local[1]..........: 1abf614
Local[2]..........: 566535
Local[3]..........: 1abe21c
Local[4]..........: 5d56c0
Local[5]..........: 1abf5a8
Local[6]..........: 0
Operand[1]........: 1aae63c

Method............: 5c4ce8 'com/sun/midp/midlet/Scheduler.schedule (virtual)'
Stack Chunk.......: 1abf5a8
Frame Pointer.....: 1abf614
Current IP........: 566538 = 566504 + offset 52
Previous Frame....: 1abf5e0
Previous IP.......: 56efb1 (offset 29)
Frame size........: 7 (2 arguments, 5 local variables)
Argument[0].......: 1abe410
Argument[1].......: 1ab1d3c
Local[2]..........: 1abde84
Local[3]..........: 1abf5e0
Local[4]..........: 56efad
Local[5]..........: 1abf5f4
Local[6]..........: 5c4c08
Operand[1]........: 1abe410

Method............: 5cb0b8 'com/sun/midp/main/Main.runLocalClass (static)'
Stack Chunk.......: 1abf5a8
Frame Pointer.....: 1abf5e0
Current IP........: 56efb1 = 56ef94 + offset 29
Previous Frame....: 1abf5bc
Previous IP.......: 56ea4c (offset 88)
Frame size........: 3 (1 arguments, 2 local variables)
Argument[0].......: 1abf008
Local[1]..........: 1ab1d3c
Local[2]..........: 1abe1e8

Method............: 5cb038 'com/sun/midp/main/Main.main (static)'
Stack Chunk.......: 1abf5a8
Frame Pointer.....: 1abf5bc
Current IP........: 56ea4c = 56e9f4 + offset 88
Previous Frame....: 0
Previous IP.......: 1
Frame size........: 3 (1 arguments, 2 local variables)
Argument[0].......: 1abf890
Local[1]..........: 1abf008
Local[2]..........: 1abf5ac

VM status:
Instruction pointer.: 57fbc4 (offset within invoking method: 14)
Next instruction....: 0x4c
Frame pointer.......: 1abf64c
Local pointer.......: 1abf630
Stack size..........: 256; sp: 1abf664; ranges: 1abf5b0-1abf7b0;1abf30c-1abf50c;

Contents of the current stack frame:
1abf630: 1abde84 (lp)
1abf634: 1abf614
1abf638: 566535
1abf63c: 1abe21c
1abf640: 5d56c0
1abf644: 1abf5a8
1abf648: 0
1abf64c: 1abf614 (fp)
1abf650: 566538
1abf654: 1abf62c
1abf658: 5d58a8
1abf65c: 1abf5a8
1abf660: 0 (end of frame)
1abf664: 1aae63c (sp)
Execution stack contains 184 items:
1abf890
1abf008
1abf5ac
0
1
1abf5ac
5cb038
1abf5a8
0
1abf008
1ab1d3c
1abe1e8
1abf5bc
56ea4c
1abf5d0
5cb0b8
1abf5a8
0
1abe410
1ab1d3c
1abde84
1abf5e0
56efad
1abf5f4
5c4c08
1abf5e0
56efb1
1abf5f4
5c4ce8
1abf5a8
0
1abe410
1abde84
1abf614
566535
1abe21c
5d56c0
1abf5a8
0
1abf614
566538
1abf62c
5d58a8
1abf5a8
0
1aae63c

ALERT: java/lang/VerifyError: fly/Fly.

Press ENTER to continue . . .



jdk建议用1.4


真机中不可以访问文件系统


人家没说是文件系统啊
是jar包内的图片


Eclipse默认已经把资源文件都存于res目录中,你把i1=Image.createImage("/res/fly.png"); 改成i1=Image.createImage("/fly.png");试看看


还有你说Image.create(100,100);报错,不知道你在哪用到了i1,可能你用到了Sprite,看清楚Sprite的定义


Eclipse默认已经把资源文件都存于res目录中,你把i1=Image.createImage("/res/fly.png"); 改成i1=Image.createImage("/fly.png");试看看


这样也是不行啊 晕死~




i1=Image.createImage("res/fly.png");


你这样写试一下,不加当前目录的/


试了 不行,还是那样,并且我已经换了JDK1.4.2


把加载图片放在构造函数里,startApp()别做太多事情


楼上的朋友说的有道理 我试下


还是哪个样子,模拟器一闪而过

控制台上留下:

Error verifying method fly/Fly ()V
Approximate bytecode offset 14: Inconsistent or missing stackmap at target


但在ECLIPSE运行仍然OK


i1=Image.createImage("fly.png");

这样


错了错了,你在ECLIPSE下运行KJAVA是吗?
ECLIPSE好象不支持RES包的
你得把图片都整到外边来,不要放在RES里了,那样ECLIPSE不会认识!
你就把他们都放在跟程序源码一个目录下,完了定义的时候用i1=Image.createImage("/fly.png");

这样就没错了,就是麻烦点!
如果你要放手机上测试,记得把原来那些该放到RES里的都放回去!用WTK编译打包哦!程序i1=Image.createImage("/fly.png");还是这样写,不用动的!

如果不把图片还放回去的话,手机上是不会认识你这个i1=Image.createImage("/fly.png");路径的,因为手机上默认是跑到RES里去找图片的!跟EC不一样
你试一下吧


setup37() 的方法导致IO异常

楼上朋友所说的也不行。

应该不是路径的问题 因为:如果加入一行:
InputStream imageStream = getClass().getResourceAsStream("/res/fly.png");

这样的话是运行的过去的

但是在下一行调用i1=Image.createImage(imageStream);的话,就出现上面说到的情况。。。。。。。。。

我想死啊我。。。。 到底是哪里的问题呢?........重金悬赏


eclipse和jbuilder对文件的组织结构有所不同,在jbuilder中,你只需要在项目下建立/res/fly.png就可以了,而在eclipse中,你的文件应该如/res/res/fly.png(当然,还要看你的具体设置,我一般是设置为使用src、bin这样的配置)。

png文件无法显示的原因有很多,如文件过大、尺寸过大,还有,不正确的格式也会引起,比如说通过acdsee转成的png,acdsee可以看,java却无法读取(acdsee3.1)

InputStream imageStream = getClass().getResourceAsStream("/res/fly.png");
可以通过不奇怪,因为imageStream可以为null,不信你可以试试
System.out.println(null==imageStream);
如果输出为true,说明仍然是没有正确定位到资源文件。


呵呵 谢谢了 搞定


↑返回目录
前一篇: 主线程和子线程的关系
后一篇: 专家来:程序中怎么判断手机是用CMNET还是CMWAP连接网络的?