Java RXTX 库不加载本机库

Java RXTX Library doesn't load native library

基本上我想使用 RXTX Library for java 为我的 Arduino 编写一个简单的通信工具,但在加载动态库时失败得很惨。

我的系统规格:
OS: OS X Yosemite 10.10.3
Java: SDK 1.8.0_45
RXTX:2.1-7r2 - 针对英特尔 mac 运行ning 64 位 java 的修改版本,可在 here.
中找到 IDE:NetBeans 8

我检查过,这些文件按照安装说明工作,只需将这两个文件复制到 /Library/Java/Extensions 目录即可。

现在我想删除它们并从我的应用程序加载库。 我做了以下事情:

System.setProperty("java.library.path", location.getPath() + File.pathSeparator + System.getProperty("java.library.path"));

当我编译代码并尝试 运行 时,它给了我一个
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path

现在我想知道我做错了什么(也许是一些很大的误会?)

如有任何帮助,我们将不胜感激!

这是对您的问题的解释和对解决方案的建议。

RXTX在我看来有两个主要问题:

  1. 根据您的 IDE,您需要将 Mac: RXTXcomm.jarlibrxtxSerial.jnilib PC: RXTXcomm.jar, rxtxSerial.dll 放在IDE 或 Java 代码中项目的根目录,它从 IDE 到 IDE 不等。此处的文档没有涵盖如何在不同的 IDE 中执行此操作,例如 NetBeans、IntelliJ,因此我让它在 Eclipse 和 IntelliJ 上工作,但还不能在 NetBeans 上工作。我还有其他问题。
  2. 根据你的OS,即使你把这个包安装起来运行,以Windows 8.1为例,关闭端口也有问题。唯一的解决办法是重新启动 IDE/console 并重新连接。

无论如何我建议你转到一个问题更少的包 JSSC

下面是一个简单的使用JSSC从串口读取数据的例子:

public class Main {

    public static void main(String[] args) {
        SerialPort serialPort = new SerialPort("COM1");
        try {
            serialPort.openPort();//Open serial port
            serialPort.setParams(9600, 8, 1, 0);//Set params.
            byte[] buffer = serialPort.readBytes(10);//Read 10 bytes from serial port
            serialPort.closePort();//Close serial port
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }
}

注意:这是一个开放的答案,如果你们中的任何人对此有经验,请通过编辑答案来贡献。 我见过有人问我一般的 RXTX 问题和几乎相同的问题。

我遇到了同样的问题,但相信我知道原因。

我之前在 OSX (Maverick) 上使用 RXTX,但发现我需要的功能仅在 Java 8 JDK 中可用。我在机器上的 Java 6 JDK 上安装了它,完成后无法 运行 使用 RXTX 库的任何代码。

我认为问题在于 JDK 6 之后的版本不包含 RXTX 要求的 32 位环境。

如果您使用的是较新的 JDK,那么我建议您安装 Java 6 JDK 并查看这是否可以解决您的问题。以前 运行 编译我的程序时,我需要包含“-d32”以指定使用 32 位环境。即:"java -d32 test"

加上我最近的回复

这是删除上述缓存的代码:

try {
    Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
    fieldSysPath.setAccessible(true);
    fieldSysPath.set(null, null);
} catch (NoSuchFieldException |
        SecurityException |
        IllegalArgumentException |
        IllegalAccessException ex) {
    ex.printStackTrace(System.err);
}

所以问题不在于 rxtx 库,而是我自己未能阅读 java 文档。因为我确定这在开头的某个地方提到过。