为什么使用 RXTX 编译此 J2ME 代码时会出现错误?
我用 Sun Java ME Platform SDK 3.0
编译了这段代码,该代码将侦听串行端口:
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.*;
public class SerialPortMidlet extends MIDlet implements CommandListener, SerialPortEventListener
{
private Command download = new Command("download", Command.ITEM, 0);
private Command exit = new Command("exit", Command.ITEM, 1);
private Form f = new Form("test serial port");
private TextField ports = new TextField("data : ","",1000,TextField.ANY);
private static final String PORT_NAMES = "COM4";
private SerialPort serialPort;
private InputStream input;
private OutputStream output;
private static final int TIME_OUT = 2000;
private static final int DATA_RATE = 9600;
public SerialPortMidlet()
{
f.append(ports);
f.addCommand(download);
f.addCommand(exit);
f.setCommandListener(this);
}
public void startApp() {
Display.getDisplay(this).setCurrent(f);
initialize();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
public void commandAction(Command c, Displayable d) {
if (c == exit)
destroyApp(true);
}
public void initialize() {
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
if (currPortId.getName().equals(PORT_NAMES)) {
portId = currPortId;
}
}
if (portId == null) {
System.out.println("Could not find COM port.");
return;
}
try
{
// open serial port, and use class name for the appName.
serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);
// set port parameters
serialPort.setSerialPortParams( DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE );
// open the streams
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
// add event listeners
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
public synchronized void close() {
if (serialPort != null) {
serialPort.removeEventListener();
serialPort.close();
}
}
public void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
{
try {
int available = input.available();
byte chunk[] = new byte[available];
input.read(chunk, 0, available);
// Displayed results are codepage dependent
ports.setString(new String(chunk));
System.out.print(new String(chunk));
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
}
输出显示:
pre-init:
pre-load-properties:
exists.config.active:
exists.netbeans.user:
exists.user.properties.file:
load-properties:
exists.platform.active:
exists.platform.configuration:
exists.platform.profile:
basic-init:
cldc-pre-init:
cldc-init:
cdc-init:
bdj-init:
post-init:
init:
conditional-clean-init:
conditional-clean:
pre-clean:
clean-timestamp:
clean-preprocessed:
clean-classes:
Deleting directory C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
clean-obfuscated:
clean-preverified:
clean-manifest:
clean-jar:
clean-jad:
clean-javadoc:
clean-j9:
Deleting: C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\convert883343865
post-clean:
do-clean:
clean:
deps-jar:
pre-preprocess:
do-preprocess:
post-preprocess:
preprocess:
pre-compile:
extract-libs:
Created dir: C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
Expanding: D:\rxtx-2.1-7-bins-r2\RXTXcomm.jar into C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
do-compile:
Compiling 1 source file to C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:16: cannot access java.util.EventListener
class file for java.util.EventListener not found
public class SerialPortMidlet extends MIDlet implements CommandListener, SerialPortEventListener
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:34: cannot find symbol
symbol : variable this
location: class SerialPortMidlet
f.setCommandListener(this);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:37: cannot find symbol
symbol : variable this
location: class SerialPortMidlet
Display.getDisplay(this).setCurrent(f);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:65: cannot find symbol
symbol : variable this
location: class SerialPortMidlet
serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:78: cannot find symbol
symbol : variable this
location: class SerialPortMidlet
serialPort.addEventListener(this);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:92: cannot access java.util.EventObject
class file for java.util.EventObject not found
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
6 errors
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\nbproject\build-impl.xml:246: Compile failed; see the compiler error output for details.
BUILD FAILED (total time: 7 seconds)
系统是 Windows XP 并且我已经将 RXTXcomm.jar 添加到 图书馆与图书馆项目属性的资源
。那么为什么会出现这些错误呢?
I compiled this code with Sun Java ME Platform SDK 3.0
, the code will listen to serial port:
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.*;
public class SerialPortMidlet extends MIDlet implements CommandListener, SerialPortEventListener
{
private Command download = new Command("download", Command.ITEM, 0);
private Command exit = new Command("exit", Command.ITEM, 1);
private Form f = new Form("test serial port");
private TextField ports = new TextField("data : ","",1000,TextField.ANY);
private static final String PORT_NAMES = "COM4";
private SerialPort serialPort;
private InputStream input;
private OutputStream output;
private static final int TIME_OUT = 2000;
private static final int DATA_RATE = 9600;
public SerialPortMidlet()
{
f.append(ports);
f.addCommand(download);
f.addCommand(exit);
f.setCommandListener(this);
}
public void startApp() {
Display.getDisplay(this).setCurrent(f);
initialize();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
public void commandAction(Command c, Displayable d) {
if (c == exit)
destroyApp(true);
}
public void initialize() {
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
if (currPortId.getName().equals(PORT_NAMES)) {
portId = currPortId;
}
}
if (portId == null) {
System.out.println("Could not find COM port.");
return;
}
try
{
// open serial port, and use class name for the appName.
serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);
// set port parameters
serialPort.setSerialPortParams( DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE );
// open the streams
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
// add event listeners
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
public synchronized void close() {
if (serialPort != null) {
serialPort.removeEventListener();
serialPort.close();
}
}
public void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
{
try {
int available = input.available();
byte chunk[] = new byte[available];
input.read(chunk, 0, available);
// Displayed results are codepage dependent
ports.setString(new String(chunk));
System.out.print(new String(chunk));
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
}
And the output shows :
pre-init:
pre-load-properties:
exists.config.active:
exists.netbeans.user:
exists.user.properties.file:
load-properties:
exists.platform.active:
exists.platform.configuration:
exists.platform.profile:
basic-init:
cldc-pre-init:
cldc-init:
cdc-init:
bdj-init:
post-init:
init:
conditional-clean-init:
conditional-clean:
pre-clean:
clean-timestamp:
clean-preprocessed:
clean-classes:
Deleting directory C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
clean-obfuscated:
clean-preverified:
clean-manifest:
clean-jar:
clean-jad:
clean-javadoc:
clean-j9:
Deleting: C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\convert883343865
post-clean:
do-clean:
clean:
deps-jar:
pre-preprocess:
do-preprocess:
post-preprocess:
preprocess:
pre-compile:
extract-libs:
Created dir: C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
Expanding: D:\rxtx-2.1-7-bins-r2\RXTXcomm.jar into C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
do-compile:
Compiling 1 source file to C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:16: cannot access java.util.EventListener
class file for java.util.EventListener not found
public class SerialPortMidlet extends MIDlet implements CommandListener, SerialPortEventListener
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:34: cannot find symbol
symbol : variable this
location: class SerialPortMidlet
f.setCommandListener(this);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:37: cannot find symbol
symbol : variable this
location: class SerialPortMidlet
Display.getDisplay(this).setCurrent(f);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:65: cannot find symbol
symbol : variable this
location: class SerialPortMidlet
serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:78: cannot find symbol
symbol : variable this
location: class SerialPortMidlet
serialPort.addEventListener(this);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:92: cannot access java.util.EventObject
class file for java.util.EventObject not found
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
6 errors
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\nbproject\build-impl.xml:246: Compile failed; see the compiler error output for details.
BUILD FAILED (total time: 7 seconds)
The system is Windows XP and I already added the RXTXcomm.jar to the Libraries & Resources
of the project property. So why is there these errors?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
与 J2SE 不同,您不能使用外部 dll 或 JNI 来扩展 J2ME VM 的功能集。 VM 由供应商或 OEM 提供,并发布其支持级别(例如 JTWI 合规性等)。所以,简而言之,使用Rxtx库无法获得串口访问。
但是,串行端口可以通过通用 I/O 框架访问:
但是,对通信的支持是可选的,供应商可能不会实现它。您需要交叉检查设备的文档。
You cannot use external dlls or JNI to extend the feature set of J2ME VM, unlike J2SE. VM is supplied by the vendor or OEM and publish the level of support it has (such as JTWI compliance etc). So, in short, serial port access cannot be obtained by using Rxtx library.
However, serial port can be accessed by Generic I/O framework:
However, support for comm is optional and vendor might not implement it. You will need to cross check with device's documentation.