2012-01-30 112 views
1

我正在为移动设备创建一个MIDlet。这个midlet正在访问com4端口。我已经将javax.comm添加到jre1.6.0,jre6和jdk1.6.0文件夹(在lib \ ext中)。javax.comm以及如何解决java.lang.NoClassDefFoundError

我在我的项目文件夹中的名为lib的文件夹中也有javax.comm.jar,并在构建路径中引用它。

os:windows 7.
mobile:china mobile。
IDE:安装eclipseME1.8的eclipse。

,当我在Eclipse中运行该项目它给我这个错误:

java.lang.NoClassDefFoundError: MainMidlet: javax/comm/SerialPortEventListener 
    at com.sun.midp.midlet.MIDletState.createMIDlet(+29) 
    at com.sun.midp.midlet.Scheduler.schedule(+52) 
    at com.sun.midp.main.Main.runLocalClass(+28) 
    at com.sun.midp.main.Main.main(+80) 

我知道javax.comm不会在64x中的窗口工作,但为什么当我在设备安装jar它不不工作?没有错误信息,只是这个:“该jar文件被终止。”
所以我去谷歌和搜索答案,并发现txrx的Windows x86和x64,但我不知道这是否适用于移动设备中的Midlet。因为他们已经提供了这个窗口。那么我该如何解决这个问题?这里只是备案MIDlet类代码:

import javax.microedition.lcdui.*; 
import javax.microedition.midlet.MIDlet; 
import javax.microedition.midlet.MIDletStateChangeException; 
import javax.comm.*; 
import java.util.*; 
import java.io.*; 

public class MainMidlet extends MIDlet implements CommandListener, 
    SerialPortEventListener { 
// displaying this midlet 
private Display display; 
private Form form; 
private StringItem stringItem; 
private Command exitCommand; 
// serial vars 
private CommPortIdentifier portId; 
private Enumeration portList; 
private InputStream inputStream; 
private SerialPort serialPort; 
private Thread readThread; 

public MainMidlet() { 
    portList = CommPortIdentifier.getPortIdentifiers(); 
    while (portList.hasMoreElements()) { 
     portId = (CommPortIdentifier) portList.nextElement(); 
     if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { 
      if (portId.getName().equals("COM4")) { 
       this.AttachToCom(); 
      } 
     } 
    } 
} 

protected void destroyApp(boolean arg0) throws MIDletStateChangeException { 
    // TODO Auto-generated method stub 

} 

protected void pauseApp() { 
    // TODO Auto-generated method stub 

} 

public void commandAction(Command command, Displayable displayable) { 
    if (displayable == form) { 
     if (command == exitCommand) { 
      exitMIDlet(); 
     } 
    } 
} 

public void startApp() { 
    stringItem = new StringItem("Hello", "Serial app is running!"); 
    form = new Form(null, new Item[] { stringItem }); 
    exitCommand = new Command("Exit", Command.EXIT, 1); 
    form.addCommand(exitCommand); 
    form.setCommandListener(this); 
    display = Display.getDisplay(this); 
    display.setCurrent(form); 
} 

public void exitMIDlet() { 
    display.setCurrent(null); 
    notifyDestroyed(); 
} 

public void serialEvent(SerialPortEvent ev) { 
    print("serialEvent is called."); 
    switch (ev.getEventType()) { 
    case SerialPortEvent.BI: 
    case SerialPortEvent.OE: 
    case SerialPortEvent.FE: 
    case SerialPortEvent.PE: 
    case SerialPortEvent.CD: 
    case SerialPortEvent.CTS: 
    case SerialPortEvent.DSR: 
    case SerialPortEvent.RI: 
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
     break; 
    case SerialPortEvent.DATA_AVAILABLE: 
     byte[] readBuffer = new byte[20]; 
     try { 
      while (inputStream.available() > 0) { 
       inputStream.read(readBuffer); 
      } 
      print(new String(readBuffer)); 
     } catch (IOException e) { 
      print(e.getMessage()); 
     } 
     break; 
    } 
} 

private void AttachToCom() { 
    try { 
     serialPort = (SerialPort) portId.open("MyProject", 2000); 
    } catch (PortInUseException e) { 
     print(e.getMessage()); 
    } 
    try { 
     inputStream = serialPort.getInputStream(); 
    } catch (IOException e) { 
     print(e.getMessage()); 
    } 
    try { 
     serialPort.addEventListener(this); 
    } catch (TooManyListenersException e) { 
     print(e.getMessage()); 
    } 
    serialPort.notifyOnDataAvailable(true); 
    try { 
     serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, 
       SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
    } catch (UnsupportedCommOperationException e) { 
     print(e.getMessage()); 
    } 
    readThread = new Thread((Runnable) this); 
    readThread.start(); 
} 

private void print(String str) { 
    form.append(str + "\r\n"); 
} 
    } 

还有一两件事,接口SerialPortEventListener从java.util.EventListener这我java.util包中没有继承。基本上我把java.util和java.io没有的东西添加到了src文件夹中,并且每个文件都在一个单独的文件(和包)中。在这里,他们是:

//the file is named EventListener.java and in a package named java.util 
package java.util; 
/** 
* A tagging interface that all event listener interfaces must extend. 
* @since JDK1.1 
*/ 
public interface EventListener { 
} 

//the file is named EventObject.java and in a package named java.util 
//removed the comment to minimize this post 
package java.util; 

// removed the comment to minimize this post 
public class EventObject implements java.io.Serializable { 

private static final long serialVersionUID = 5516075349620653480L; 

// The object on which the Event initially occurred. 
protected transient Object source; 

// removed the comment to minimize this post 
public EventObject(Object source) { 
    if (source == null) 
     throw new IllegalArgumentException("null source"); 

    this.source = source; 
} 
// removed the comment to minimize this post 
public Object getSource() { 
    return source; 
} 
public String toString() { 
    return getClass().getName() + "[source=" + source + "]"; 
} 
} 
// the file is named TooManyEventListenersException.java and in a package named java.util 
// removed comment to reduce this post size 

package java.util; 

// removed comment to reduce this post size 
public class TooManyListenersException extends Exception { 
    // removed comment to reduce this post size 
    public TooManyListenersException() { 
     super(); 
    } 
    // removed comment to reduce this post size 
    public TooManyListenersException(String s) { 
     super(s); 
    } 
}  
// in the file named Serializable.java and in a package java.io 
package java.io; 
public interface Serializable { 
} 
+0

谢谢你让我知道这件事。我没有注意到! – jim 2012-01-30 10:12:14

回答

1

您正在使用错误的API在移动端 - 这就是为什么你坚持所有这些NoClassDefFoundError的消息和java.util中的其他失踪的东西。

在MIDP(JSR 118)设备上,应使用javax.microedition.io .CommConnection API通过串口进行通信。

+0

谢谢!只有一件事情加剧了。移动设备中不存在javax.comm。我该如何重新分配这个库?我把javax.comm放到了res文件夹中,并从那里设置了构建路径,但似乎这不会导致在移动设备中注册javax.comm。 – jim 2012-01-30 13:03:21

+0

@jim你不会在移动设备上重新分配任何东西。 CommConnection API在MIDP 2.0设备上可用。有关详细信息,请查阅JSR 118规范或[microedition io软件包API文档](http://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/javax/microedition/io/package -summary.html),“串口通信”部分 – gnat 2012-01-30 13:10:19

+0

太棒了!但System.getProperty(“microedition.commports”);没有返回任何端口(只返回0)。还有其他方法可以找到端口吗? – jim 2012-01-30 13:31:55

相关问题