2010-05-17 2 views
0

안녕하세요, java.lang을 사용하여 모바일에 SMS를 보내려고합니다. 애플리케이션을 실행할 때 다음 오류가 발생합니다.왜 "UnsatisfiedLinkError : java.library.path에 SolarisSerialParallel이 없습니다."

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 
+0

이 예외는 어떤 행에서 발생합니까? – Earlz

답변

0

. 문제를 격리 할 때 어쨌든 해결책을 찾지 못할 것입니다.

1

이것은 일반적으로 경로 문제입니다. dll에 종속되어 있지만 경로가 경로에 포함되어 있지 않습니다.

1

코드에서 (간접적으로) SolarisSerialParallel이라는 이름의 네이티브 라이브러리를로드하려고 시도하고 있습니다.이 라이브러리는 JVM에서 찾을 수 없습니다. UNIX 시스템에서는 환경 변수 LD_LIBRARY_PATH에 포함 된 디렉토리 중 하나에 libSolarisSerialParallel.so 파일이 있어야합니다. Windows에서 SolarisSerialParallel.dllPATH의 디렉토리 중 하나에 있어야합니다. 오류를 분리하려면 System.loadLibrary("SolarisSerialParallel") 행의 주 프로그램을 실행 해보십시오. JNI here에 대한 자세한 내용을 볼 수 있습니다.

관련 문제