【问题标题】:Cannot run rxtx on Mac OS无法在 Mac OS 上运行 rxtx
【发布时间】:2012-10-02 11:13:58
【问题描述】:

我正在尝试在 Mac (OSX 10.8) 上为 Java 使用 rxtx JAR 文件。我已经在/Library/Java/Extensions 中安装了RXTXcomm.jarlibrxtxSerial.jnilib 和随附的.so 文件。我正在尝试在以下位置执行示例代码:http://arduino.cc/playground/Interfacing/Java

但是当我收到一堆cannot find symbol 错误消息时,我显然遗漏了一些东西。

这里有一对:

SerialTest.java:3: cannot find symbol
symbol  : class CommPortIdentifier
location: package gnu.io
import gnu.io.CommPortIdentifier;
             ^
SerialTest.java:4: cannot find symbol
symbol  : class SerialPort
location: package gnu.io
import gnu.io.SerialPort;

在我的机器上安装的 Java 中是否缺少一些更基本的东西?我刚刚安装了 Xcode 4.5,所以我认为一切都可以运行这个简单的代码。

人们要求我将这些库放在同一目录中。随附的是 ls 和我正在运行的 javac 命令:

$javac -classpath RXTXcomm.jar:. SerialTest.java 

SerialTest.java:3: cannot find symbol
symbol  : class CommPortIdentifier
location: package gnu.io
import gnu.io.CommPortIdentifier;
             ^
SerialTest.java:4: cannot find symbol
symbol  : class SerialPort
location: package gnu.io
import gnu.io.SerialPort;
             ^
SerialTest.java:5: cannot find symbol
symbol  : class SerialPortEvent
location: package gnu.io
import gnu.io.SerialPortEvent; 
             ^
SerialTest.java:6: cannot find symbol
symbol  : class SerialPortEventListener
location: package gnu.io
import gnu.io.SerialPortEventListener; 
             ^
SerialTest.java:9: cannot find symbol
symbol: class SerialPortEventListener
public class SerialTest implements SerialPortEventListener {
                                   ^
SerialTest.java:10: cannot find symbol
symbol  : class SerialPort
location: class SerialTest
    SerialPort serialPort;
    ^
SerialTest.java:83: cannot find symbol
symbol  : class SerialPortEvent
location: class SerialTest
    public synchronized void serialEvent(SerialPortEvent oEvent) {
                                         ^
SerialTest.java:27: cannot find symbol
symbol  : class CommPortIdentifier
location: class SerialTest
        CommPortIdentifier portId = null;
        ^
SerialTest.java:28: cannot find symbol
symbol  : variable CommPortIdentifier
location: class SerialTest
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
                               ^
SerialTest.java:32: cannot find symbol
symbol  : class CommPortIdentifier
location: class SerialTest
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
            ^
SerialTest.java:32: cannot find symbol
symbol  : class CommPortIdentifier
location: class SerialTest
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
                                             ^
SerialTest.java:48: cannot find symbol
symbol  : class SerialPort
location: class SerialTest
            serialPort = (SerialPort) portId.open(this.getClass().getName(),
                          ^
SerialTest.java:53: cannot find symbol
symbol  : variable SerialPort
location: class SerialTest
                    SerialPort.DATABITS_8,
                    ^
SerialTest.java:54: cannot find symbol
symbol  : variable SerialPort
location: class SerialTest
                    SerialPort.STOPBITS_1,
                    ^
SerialTest.java:55: cannot find symbol
symbol  : variable SerialPort
location: class SerialTest
                    SerialPort.PARITY_NONE);
                    ^
SerialTest.java:84: cannot find symbol
symbol  : variable SerialPortEvent
location: class SerialTest
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
                                     ^
16 errors
MacBook-Pro:src user$ ls
RXTXcomm.jar        comm.jar        librxtxSerial.jnilib
SerialTest.java     librxtxParallel.so  librxtxSerial.so
MacBook-Pro:src user$ 

是我缺少另一个 JAR 来完成这项工作吗?我在RXTXcomm.jar 中没有看到这些类。

【问题讨论】:

  • 听起来像是类路径问题。你是如何运行你的代码的?
  • 通过 Eclipse 通过简单地运行“编译”或在命令提示符下使用简单的“javac SerialTest.java”。如果 jar 在 /Library/Java/Extensions 中,我相信这就是我需要做的,对吗?我也尝试了 -cp "/Library/Java/Extensions" ,但仍然得到相同的结果。
  • 听起来像是类路径问题。你是如何运行你的代码的?请尝试以下操作:将所有文件,包括共享库、jar 文件和示例类,复制到同一目录,然后 cd 到该目录。然后,从您的 shell 中,执行 javac -classpath RXTXcomm.jar:。 SerialTest.java 然后,执行 java -Djava.library.path=。 -cp RXTXcomm.jar:.串行测试
  • 所有文件都在同一个目录下,上面的方法还是不行:(

标签: java rxtx


【解决方案1】:

RXTX 库由两部分组成:首先是 Java/Jar 部分,其次是本机库。

如果 Java 可执行文件找不到本机 rxtx 库,则会出现错误。 因此,您应该检查此本机库的位置。 JNI 库的文件扩展名应为 .jnilib.dylib。 那么你有两种可能:

  • 第一种可能性是将本机库复制到您启动 Java 的目录中(使用 Eclipse 时,这是项目目录)。

  • 第二种可能是启动Java并指定原生库所在的库路径:

java -Djava.library.path=".:/Users/bill/rxtx/jni" MyClass 

【讨论】:

  • 我做了第一种可能性,但我仍然遇到同样的问题/错误。尝试在 Eclipse 中编译时如何“启动 java”?
  • @WildBill Put -Djava... 在 Eclipse 项目运行配置的 VM 参数中
  • 我还遗漏了什么吗? Java 抱怨找不到 SerialPort。我在 RXTXcomm.jar 文件中没有看到。
  • 另外,当我执行 -Djava.... 选项时,我在 SerialTest 上得到 NoClassDefFoundError .... 是怎么回事?
【解决方案2】:

如果在上面的这些提示之后它仍然无法正常工作,那么您可能拥有 32 位 RXTX 库。在可以运行 32 位应用程序的 Mac 上,您可以强制客户端 Java VM 在 32 位模式下工作(与某些 Java 专家所说的相反)。我通过简单地使用 -d32 选项调用 java(注意小写,因为它不是 Java 系统属性),以这种方式摆脱了 UnsatisfiedLinkError

我的旧程序与用于 Atmel 处理器的旧 RS-232 编程器进行通信时运行良好,并且在 64 位环境中运行良好。但是,请记住,对于较新的 Mac 和 64 位独占环境,该选项可能不可用 - 这是我仍然在 Core 2 Duo 上保留“双”Mac OS X Snow Leopard 的主要原因(从 Core Duo 升级戴尔笔记本移植处理器)Mac Mini。

【讨论】:

  • 您应该考虑格式化您的文本以使其更易于阅读。
【解决方案3】:

打开项目属性面板,转到库,选择按钮选项编译并单击添加 Jar/Folder,将 RXTXComm.jar 添加到列表中。那对我有用。 编译器会看到该库,因为您放置在正确的位置,然后正如 Netbeans 在项目属性面板中所说的“编译时库传播到所有库类别”,我们期望在运行时具有相同的可见性,但不会发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2012-01-15
    • 2021-05-09
    • 2012-07-09
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多