为什么我收到“UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path”
您好,我正在尝试使用 java 向我的手机发送短信。当我运行该应用程序时,我收到以下错误。
package HelloWorld;
import java.io.*;
import java.util.BitSet;
import javax.comm.*;
import java.lang.*;
public class SerialToGsm {
InputStream in;
OutputStream out;
String lastIndexRead;
String senderNum;
String smsMsg;
SerialToGsm(String porta) {
try {
// CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("serial0");
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(porta);
SerialPort sp = (SerialPort)portId.open("Sms_GSM", 0);
sp.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
sp.setFlowControlMode(sp.FLOWCONTROL_NONE);
in = sp.getInputStream();
out = sp.getOutputStream();
// modem reset
sendAndRecv("+++AT", 30); // delay for 20 sec/10
sendAndRecv("AT&F", 30);
sendAndRecv("ATE0", 30); // echo off
sendAndRecv("AT +CMEE=1", 30); // verbose error messages
sendAndRecv("AT+CMGF=0", 70); // set pdu mode
// sendAndRecv("AT V1E0S0=0&D2&C1", 1000000);
}
catch (Exception e) {
System.out.println("Exception " + e);
System.exit(1);
}
}
private String sendAndRecv(String s, int timeout) {
try {
// clean serial port input buffer
in.skip(in.available());
System.out.println("=> " + s);
s = s + "\r"; // add CR
out.write(s.getBytes());
out.flush();
String strIn = new String();
for (int i = 0; i < timeout; i++){
int numChars = in.available();
if (numChars > 0) {
byte[] bb = new byte[numChars];
in.read(bb,0,numChars);
strIn += new String(bb);
}
// start exit conditions
// ---------------------
if (strIn.indexOf(">\r\n") != -1) {
break;
}
if (strIn.indexOf("OK\r\n") != -1){
break;
}
if (strIn.indexOf("ERROR") != -1) { // if find 'error' wait for CR+LF
if (strIn.indexOf("\r\n",strIn.indexOf("ERROR") + 1) != -1) {
break;
}
}
Thread.sleep(100); // delay 1/10 sec
}
System.out.println("<= " + strIn);
if (strIn.length() == 0) {
return "ERROR: len 0";
}
return strIn;
}
catch (Exception e) {
System.out.println("send e recv Exception " + e);
return "ERROR: send e recv Exception";
}
}
public String sendSms (String numToSend, String whatToSend) {
ComputSmsData sms = new ComputSmsData();
sms.setAsciiTxt(whatToSend);
sms.setTelNum(numToSend);
// sms.setSMSCTelNum("+393359609600"); // SC fixed
String s = new String();
s = sendAndRecv("AT+CMGS=" + (sms.getCompletePduData().length() / 2) + "\r", 30);
// System.out.println("==> AT+CMGS=" + (sms.getCompletePduData().length() / 2));
// System.out.println("<== " + s);
if (s.indexOf(">") != -1) {
// s = sendAndRecv(sms.getSMSCPduData() + sms.getCompletePduData() + "\u001A"); // usefull one day?
// System.out.println("Inviero questo >>>> " + sms.getCompletePduData());
// if this sintax won't work try remove 00 prefix
s = sendAndRecv("00" + sms.getCompletePduData() + "\u001A", 150);
// System.out.println("<== " + s);
return s;
}
else {
return "ERROR";
}
}
// used to reset message data
private void resetGsmObj() {
lastIndexRead = null;
senderNum = null;
smsMsg = null;
}
public String checkSms (){
String str = new String();
String strGsm = new String();
strGsm = sendAndRecv("AT+CMGL=0", 30); // list unread msg and sign them as read
// if answer contain ERROR then ERROR
if (strGsm.indexOf("ERROR") != -1) {
resetGsmObj();
return strGsm; // error
}
strGsm = sendAndRecv("AT+CMGL=1", 30); // list read msg
// if answer contain ERROR then ERROR
if (strGsm.indexOf("ERROR") != -1) {
resetGsmObj();
return strGsm; // error
}
// evaluate message index
if (strGsm.indexOf(':') <= 0) {
resetGsmObj();
return ("ERROR unexpected answer");
}
str = strGsm.substring(strGsm.indexOf(':') + 1,strGsm.indexOf(','));
str = str.trim(); // remove white spaces
// System.out.println("Index: " + str);
lastIndexRead = str;
// find message string
// -------------------
// look for start point (search \r, then skip \n, add and one more for right char
int startPoint = strGsm.indexOf("\r",(strGsm.indexOf(":") + 1)) + 2;
int endPoint = strGsm.indexOf("\r",startPoint + 1);
if (endPoint == -1) {
// only one message
endPoint = strGsm.length();
}
// extract string
str = strGsm.substring(startPoint, endPoint);
System.out.println("String to be decoded :" + str);
ComputSmsData sms = new ComputSmsData();
sms.setRcvdPdu(str);
// SMSCNum = new String(sms.getRcvdPduSMSC());
senderNum = new String(sms.getRcvdSenderNumber());
smsMsg = new String(sms.getRcvdPduTxt());
System.out.println("SMSC number: " + sms.getRcvdPduSMSC());
System.out.println("Sender number: " + sms.getRcvdSenderNumber());
System.out.println("Message: " + sms.getRcvdPduTxt());
return "OK";
}
public String readSmsSender() {
return senderNum;
}
public String readSms() {
return smsMsg;
}
public String delSms() {
if (lastIndexRead != "") {
return sendAndRecv("AT+CMGD=" + lastIndexRead, 30);
}
return ("ERROR");
}
}
错误:
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: com.sun.comm.SolarisDriver.readRegistrySerial(Ljava/util/Vector;Ljava/lang/String;)I while loading driver com.sun.comm.SolarisDriver
Exception javax.comm.NoSuchPortException
Hi i am trying to send sms to my mobile using java.When I run the application I am getting the the follwing error.
package HelloWorld;
import java.io.*;
import java.util.BitSet;
import javax.comm.*;
import java.lang.*;
public class SerialToGsm {
InputStream in;
OutputStream out;
String lastIndexRead;
String senderNum;
String smsMsg;
SerialToGsm(String porta) {
try {
// CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("serial0");
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(porta);
SerialPort sp = (SerialPort)portId.open("Sms_GSM", 0);
sp.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
sp.setFlowControlMode(sp.FLOWCONTROL_NONE);
in = sp.getInputStream();
out = sp.getOutputStream();
// modem reset
sendAndRecv("+++AT", 30); // delay for 20 sec/10
sendAndRecv("AT&F", 30);
sendAndRecv("ATE0", 30); // echo off
sendAndRecv("AT +CMEE=1", 30); // verbose error messages
sendAndRecv("AT+CMGF=0", 70); // set pdu mode
// sendAndRecv("AT V1E0S0=0&D2&C1", 1000000);
}
catch (Exception e) {
System.out.println("Exception " + e);
System.exit(1);
}
}
private String sendAndRecv(String s, int timeout) {
try {
// clean serial port input buffer
in.skip(in.available());
System.out.println("=> " + s);
s = s + "\r"; // add CR
out.write(s.getBytes());
out.flush();
String strIn = new String();
for (int i = 0; i < timeout; i++){
int numChars = in.available();
if (numChars > 0) {
byte[] bb = new byte[numChars];
in.read(bb,0,numChars);
strIn += new String(bb);
}
// start exit conditions
// ---------------------
if (strIn.indexOf(">\r\n") != -1) {
break;
}
if (strIn.indexOf("OK\r\n") != -1){
break;
}
if (strIn.indexOf("ERROR") != -1) { // if find 'error' wait for CR+LF
if (strIn.indexOf("\r\n",strIn.indexOf("ERROR") + 1) != -1) {
break;
}
}
Thread.sleep(100); // delay 1/10 sec
}
System.out.println("<= " + strIn);
if (strIn.length() == 0) {
return "ERROR: len 0";
}
return strIn;
}
catch (Exception e) {
System.out.println("send e recv Exception " + e);
return "ERROR: send e recv Exception";
}
}
public String sendSms (String numToSend, String whatToSend) {
ComputSmsData sms = new ComputSmsData();
sms.setAsciiTxt(whatToSend);
sms.setTelNum(numToSend);
// sms.setSMSCTelNum("+393359609600"); // SC fixed
String s = new String();
s = sendAndRecv("AT+CMGS=" + (sms.getCompletePduData().length() / 2) + "\r", 30);
// System.out.println("==> AT+CMGS=" + (sms.getCompletePduData().length() / 2));
// System.out.println("<== " + s);
if (s.indexOf(">") != -1) {
// s = sendAndRecv(sms.getSMSCPduData() + sms.getCompletePduData() + "\u001A"); // usefull one day?
// System.out.println("Inviero questo >>>> " + sms.getCompletePduData());
// if this sintax won't work try remove 00 prefix
s = sendAndRecv("00" + sms.getCompletePduData() + "\u001A", 150);
// System.out.println("<== " + s);
return s;
}
else {
return "ERROR";
}
}
// used to reset message data
private void resetGsmObj() {
lastIndexRead = null;
senderNum = null;
smsMsg = null;
}
public String checkSms (){
String str = new String();
String strGsm = new String();
strGsm = sendAndRecv("AT+CMGL=0", 30); // list unread msg and sign them as read
// if answer contain ERROR then ERROR
if (strGsm.indexOf("ERROR") != -1) {
resetGsmObj();
return strGsm; // error
}
strGsm = sendAndRecv("AT+CMGL=1", 30); // list read msg
// if answer contain ERROR then ERROR
if (strGsm.indexOf("ERROR") != -1) {
resetGsmObj();
return strGsm; // error
}
// evaluate message index
if (strGsm.indexOf(':') <= 0) {
resetGsmObj();
return ("ERROR unexpected answer");
}
str = strGsm.substring(strGsm.indexOf(':') + 1,strGsm.indexOf(','));
str = str.trim(); // remove white spaces
// System.out.println("Index: " + str);
lastIndexRead = str;
// find message string
// -------------------
// look for start point (search \r, then skip \n, add and one more for right char
int startPoint = strGsm.indexOf("\r",(strGsm.indexOf(":") + 1)) + 2;
int endPoint = strGsm.indexOf("\r",startPoint + 1);
if (endPoint == -1) {
// only one message
endPoint = strGsm.length();
}
// extract string
str = strGsm.substring(startPoint, endPoint);
System.out.println("String to be decoded :" + str);
ComputSmsData sms = new ComputSmsData();
sms.setRcvdPdu(str);
// SMSCNum = new String(sms.getRcvdPduSMSC());
senderNum = new String(sms.getRcvdSenderNumber());
smsMsg = new String(sms.getRcvdPduTxt());
System.out.println("SMSC number: " + sms.getRcvdPduSMSC());
System.out.println("Sender number: " + sms.getRcvdSenderNumber());
System.out.println("Message: " + sms.getRcvdPduTxt());
return "OK";
}
public String readSmsSender() {
return senderNum;
}
public String readSms() {
return smsMsg;
}
public String delSms() {
if (lastIndexRead != "") {
return sendAndRecv("AT+CMGD=" + lastIndexRead, 30);
}
return ("ERROR");
}
}
ERROR:
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: com.sun.comm.SolarisDriver.readRegistrySerial(Ljava/util/Vector;Ljava/lang/String;)I while loading driver com.sun.comm.SolarisDriver
Exception javax.comm.NoSuchPortException
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这通常是一个路径问题:您依赖于一个 dll,但它所在的目录不在您的路径上。
This is generally a path problem: you're dependent on a dll, but the directory it's in is not on your path.
您的代码正在尝试(间接)加载名为
SolarisSerialParallel
的本机库,JVM 无法找到该库。在 UNIX 计算机上,环境变量LD_LIBRARY_PATH
中包含的目录之一中应该有libSolarisSerialParallel.so
文件。在 Windows 上,SolarisSerialParallel.dll
应位于PATH
中的目录之一。要隔离错误,请尝试使用System.loadLibrary("SolarisSerialParallel")
行运行主程序。您可以在此处了解有关 JNI 的更多信息。Your code is attempting (indirectly) to load a native library named
SolarisSerialParallel
, which the JVM is unable to locate. On UNIX machines, you should havelibSolarisSerialParallel.so
file in one of the directories included in the environment variableLD_LIBRARY_PATH
. On Windows,SolarisSerialParallel.dll
should be in one of the directories in thePATH
. To isolate the error, try running a main program with the lineSystem.loadLibrary("SolarisSerialParallel")
. You can read more about JNI here.我建议将这段代码削减为更简单的测试用例。无论如何,当您隔离问题时,您最终可能会找到解决方案。
I would suggest paring down this glob of code into a simpler test case. You will probably end up finding the solution anyway as you isolate the problem.