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 目录即可。
现在我想删除它们并从我的应用程序加载库。
我做了以下事情:
- 将 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
现在我想知道我做错了什么(也许是一些很大的误会?)
如有任何帮助,我们将不胜感激!
这是对您的问题的解释和对解决方案的建议。
RXTX在我看来有两个主要问题:
- 根据您的 IDE,您需要将 Mac:
RXTXcomm.jar
和 librxtxSerial.jnilib
PC: RXTXcomm.jar
, rxtxSerial.dll
放在IDE 或 Java 代码中项目的根目录,它从 IDE 到 IDE 不等。此处的文档没有涵盖如何在不同的 IDE 中执行此操作,例如 NetBeans、IntelliJ,因此我让它在 Eclipse 和 IntelliJ 上工作,但还不能在 NetBeans 上工作。我还有其他问题。
- 根据你的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);
}
}
}
- 查看 JSSC 代码的所有示例
- 可以下载包here。
- JSSC home page
注意:这是一个开放的答案,如果你们中的任何人对此有经验,请通过编辑答案来贡献。
我见过有人问我一般的 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 文档。因为我确定这在开头的某个地方提到过。
基本上我想使用 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 目录即可。
现在我想删除它们并从我的应用程序加载库。 我做了以下事情:
- 将 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
现在我想知道我做错了什么(也许是一些很大的误会?)
如有任何帮助,我们将不胜感激!
这是对您的问题的解释和对解决方案的建议。
RXTX在我看来有两个主要问题:
- 根据您的 IDE,您需要将 Mac:
RXTXcomm.jar
和librxtxSerial.jnilib
PC:RXTXcomm.jar
,rxtxSerial.dll
放在IDE 或 Java 代码中项目的根目录,它从 IDE 到 IDE 不等。此处的文档没有涵盖如何在不同的 IDE 中执行此操作,例如 NetBeans、IntelliJ,因此我让它在 Eclipse 和 IntelliJ 上工作,但还不能在 NetBeans 上工作。我还有其他问题。 - 根据你的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);
}
}
}
- 查看 JSSC 代码的所有示例
- 可以下载包here。
- JSSC home page
注意:这是一个开放的答案,如果你们中的任何人对此有经验,请通过编辑答案来贡献。 我见过有人问我一般的 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 文档。因为我确定这在开头的某个地方提到过。