redxef
redxef

Reputation: 512

Java RXTX Library doesn't load native library

Basically i wanted to write a simple communication tool for my Arduino using the RXTX Library for java and failed horribly when it came to loading the dynamic library.

My system specs:
OS: OS X Yosemite 10.10.3
Java: SDK 1.8.0_45
RXTX: 2.1-7r2 - modified version for intel mac running 64 bit java, which can be found here.
IDE: NetBeans 8

I checked, that these files work by following the install instructions, which is simply copying these two files into the /Library/Java/Extensions directory.

Now I wanted to remove them and load the library from my application. I did the following:

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

When I compiled the code and tried to run it, it gave me an
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path

Now I'm wondering what i have done wrong (maybe some great misunderstanding?)

Any help would be appreciated!

Upvotes: 3

Views: 4308

Answers (3)

redxef
redxef

Reputation: 512

In addition to my recent reply this one.

This is the code to delete the mentioned cache:

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);
}

So the issue was not the rxtx library but rather my own failure to read the java doc. Because I'm sure this is mentioned somewhere right at the beginning.

Upvotes: 0

AGuyNamedTom
AGuyNamedTom

Reputation: 11

I am having the same issue, but believe that I know the cause.

I previously had RXTX functioning on OSX (Maverick) but found that I required functionality only available within the Java 8 JDK. I installed this over the Java 6 JDK that was on the machine and once completed was unable to run any code utilizing the RXTX library.

I believe the issue is that JDK releases after 6 do not include a 32 bit environment which is what RXTX requires.

If you are using a newer JDK then I would recommend installing the Java 6 JDK and seeing if this resolves your issue. When previously running my compiled programs I would need to include "-d32" to specify to utilize the 32 bit environment. ie: "java -d32 test"

Upvotes: 1

Maytham Fahmi
Maytham Fahmi

Reputation: 33437

This an explanations to your problem and a suggestion to a solution.

RXTX has two major problems in my opinion:

  1. Depending on your IDE, you need to place the Mac: RXTXcomm.jar and librxtxSerial.jnilib PC: RXTXcomm.jar, rxtxSerial.dll on the root of the project in your IDE or Java code, it varies from IDE to IDE. The documentation here does not cover how to do it in different IDE like NetBeans, IntelliJ even thus I got it to work on both Eclipse and IntelliJ, but not NetBeans yet. I still have other issues.
  2. Depending on your OS, even if you get this package up and run, in Windows 8.1 as example, it has problem closing the port. And the only solution is to restart you IDE/console and reconnect.

Any way I suggest you going over to a more problem less package called JSSC

Here is a simple reading data from serial port using 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);
        }
    }
}

Note: This is an open answer, if any one of you have experience regarding this please contribute by editing the answer. I have seen people asking question and having almost same problem with RXTX I general.

Upvotes: 1

Related Questions