Java RXTX库无法加载本地库

3
基本上我想为我的Arduino编写一个简单的通信工具,使用RXTX Library for java,但在加载动态库时失败了。
我的系统规格:
操作系统:OS X Yosemite 10.10.3
Java:SDK 1.8.0_45
RXTX:2.1-7r2 - 修改版本,适用于运行64位Java的Intel Mac,可在此处找到。
IDE:NetBeans 8
我检查了这些文件是否有效,遵循安装说明,即将这两个文件复制到/Library/Java/Extensions目录中。
现在,我想将它们删除并从我的应用程序中加载库。 我做了以下事情:
  • 在netbeans中将RXTXcomm库添加到项目中。
  • 使用以下代码将本地库的容器包含在“java.library.path”属性中

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

  • 并且使用System.loadLibrary("rxtxSerial")加载库文件。

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

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

任何帮助都将不胜感激!


你的项目根目录下应该有以下3个文件:RXTXcomm.jar、rxtxParallel.dll和rxtxSerial.dll。这些文件放置的位置因IDE而异。如果这对你有帮助,请告诉我,我可以提供指南来解决问题。 - Maytham Fahmi
好的,我使用的是Mac电脑,因此我只有两个文件:RXTXcomm.jar和librxtxSerial.jnilib。(在下载预编译文件时,Mac没有并行本地库) - redxef
好的,尝试使用jssc吧,因为我对RXTX的经验不是很好,遇到了很多问题。也许JSSC能为你解决这个问题。 - Maytham Fahmi
np,示例:https://code.google.com/p/java-simple-serial-connector/wiki/jSSC_examples - Maytham Fahmi
新软件包有进展吗? - Maytham Fahmi
显示剩余7条评论
3个回答

1
我遇到了同样的问题,但相信我知道原因。
之前我在OSX(Maverick)上使用了RXTX,但发现我需要的功能只能在Java 8 JDK中使用。我将其安装在机器上的Java 6 JDK上,并且一旦完成后就无法运行任何使用RXTX库的代码。
我认为问题在于JDK 6之后的版本不包括RXTX所需的32位环境。
如果您正在使用更新的JDK,则建议安装Java 6 JDK并查看是否解决了问题。以前运行我的编译程序时,我需要包括“-d32”来指定使用32位环境,例如:“java -d32 test”。

我最近才发现这个问题:由于Java只在启动时添加库,如果您在虚拟机已经运行时更改它们,它不会改变任何东西。解决方法是删除缓存或使用正确的参数使可执行文件重新启动自身。 - redxef

1
这是对您问题的解释和解决方案的建议。
我认为RXTX有两个主要问题:
1. 根据您使用的IDE,您需要将Mac上的RXTXcomm.jarlibrxtxSerial.jnilib PC上的RXTXcomm.jarrxtxSerial.dll放置在IDE或Java代码中项目的根目录中,不同的IDE可能会有所不同。这里的文档未涵盖如何在不同的IDE(如NetBeans,IntelliJ)中执行此操作,尽管我已经在Eclipse和IntelliJ上使其正常工作,但仍然存在其他问题,而我还没有在NetBeans上进行尝试。
2. 根据您的操作系统,即使您成功运行了该软件包,在Windows 8.1等操作系统中,它也有关闭端口的问题。唯一的解决方法是重新启动您的IDE /控制台并重新连接。
总之,我建议您转向一个更没有问题的软件包,称为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几乎相同的问题。


0

除了我最近的回复这个之外。

这是删除所提到的缓存的代码:

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文档。因为我相信这个问题在一开始就有提到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接