Java RXTX Library不加载本机库

时间:2015-07-04 00:55:38

标签: java macos arduino rxtx

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

我的系统规格:
OS: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 个答案:

答案 0 :(得分: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 /控制台并重新连接。
  3. 我建议你去看一个名为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一般有相同的问题。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

除了我最近的回复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文档。因为我确信在开头就提到了这一点。