【问题标题】:Java RXTX Library doesn't load native libraryJava RXTX 库不加载本机库
【发布时间】:2015-07-04 00:55:38
【问题描述】:

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

我的系统规格:
操作系统:OS X Yosemite 10.10.3
Java:SDK 1.8.0_45
RXTX:2.1-7r2 - 运行 64 位 java 的 intel mac 的修改版本,可以找到 here
IDE:NetBeans 8

我检查了这些文件是否可以按照安装说明工作,安装说明只是将这两个文件复制到 /Library/Java/Extensions 目录中。

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

  • 将 RXTXcomm 库添加到 netbeans 中的项目中。
  • 使用以下代码将本机库的容器包含在“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 放置这些文件的位置不同。让我知道这是否有帮助。所以我可以用指南来回答它。
  • 好吧,我在 Mac 上,因此我只有 2 个文件:RXTXcomm.jar 和 librxtxSerial.jnilib。 (下载预编译文件时,没有适用于mac的并行native lib)
  • 没问题,概念是一样的,windows我也遇到过同样的问题,问题是,从你的IDE编译时,需要知道文件的位置,我想如果您发现将它们放置在项目的正确根文件夹位置将解决问题。否则我建议你去 JSSC 包更好code.google.com/p/java-simple-serial-connector
  • 我检查了两次和三次路径,它是正确的,这就是我加载目录后得到的:file:/Users/redxef/NetBeansProjects/arduino_io/dist/lib:/Users/ redxef/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:。并且在第一个目录中都是文件
  • OK,试试jssc,因为我对RXTX的体验不是很好,遇到了很多问题。也许JSSC会为你解决。

标签: java macos arduino rxtx


【解决方案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 I 一般有几乎相同的问题。

【讨论】:

    【解决方案2】:

    我有同样的问题,但相信我知道原因。

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

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

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

    【讨论】:

    • 我最近发现了这个问题:由于 Java 只在启动时添加库,因此如果在虚拟机已经启动并运行时更改它们,它不会改变任何内容。一种解决方法是删除缓存或使用正确的参数使可执行文件重新启动。
    【解决方案3】:

    除了我最近的回复this one

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

    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 文档。因为我确定在开头的某个地方就提到了这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多