2012-01-30 10 views
1

私はモバイル用のミッドレットを作成しています。このミッドレットはcom4ポートにアクセスしています。 jre1.6.0、jre6、jdk1.6.0の各フォルダ(lib \ ext)に既にjavax.commを追加しています。javax.commとjava.lang.NoClassDefFoundErrorを修正する方法

また、私のプロジェクトフォルダのlibという名前のフォルダにjavax.comm.jarがあり、それをビルドパスで参照しています。

os:windows 7.
モバイル:china mobile
IDE:eclipseME1.8をインストールしたeclipse。私はjavax.commは64倍のウィンドウ上では動作しませんことを知って

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) 

が、私は、デバイス内のjarファイルをインストールするときに、なぜそれはdoesnの:

私は日食でプロジェクトを実行すると、それは私に、このエラーを与えています仕事は?エラーメッセージは表示されません。「jarファイルは終了しました。
私はgoogleに行き、答えを探して、Windows x86とx64用のtxrxを見つけましたが、これがモバイルデバイスの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パッケージにはありませんjava.util.EventListenerの継承:ここだけのレコードのMIDletクラスのコードがあります。基本的には、私のjava.utilとjava.ioにsrcフォルダとそれぞれのファイル(とパッケージ)を持たないものを追加しました。ここではそれらは:あなたがモバイル側で間違ったAPIを使用している

//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

答えて

1

- あなたは、これらすべてのNoClassDefFoundErrorがメッセージやjava.utilの他の不足しているもので立ち往生している理由です。

MIDP(JSR 118)デバイスでは、javax.microedition.io .CommConnection APIを使用してシリアルポート経由で通信する必要があります。

+0

ありがとう!ただ一つの事がポップアップしました。 javax.commはモバイル・デバイスには存在しません。どのように私はこのライブラリを再配布できますか?私は、resフォルダにjavax.commを置いてそこからビルドパスを設定しましたが、これはモバイルデバイスのjavax.commの登録を引き起こさないようです。 – jim

+0

@jimあなたは_reistribute_何もモバイルの通信を期待されていません。 CommConnection APIは、MIDP 2.0デバイスで利用可能なものです。詳細は、JSR 118仕様または[microedition io package API docs](http://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/javax/microedition/io/package)を参照してください。 -summary.html)、セクション「シリアルポート通信」 – gnat

+0

素晴らしい!しかし、System.getProperty( "microedition.commports");ポートを返さない(0だけを返す)。ポートを見つける他の方法はありますか? – jim

関連する問題