java使用JNative调用动态连接库实例

import heidu004.domain.EmployeeInfo;
import heidu004.persistence.EmployeeInfoDAOImpl;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

public class Dll {
   /* 
    *WebInterface.dll中相关方法
    * --------------------------------------------------------------------------------------------
 *function EncryptPswStr(PswStr, ResultBuff: PChar; PswLen, BuffLen: Integer): Integer; stdcall;
 *加密密码字符串
 *参数:
 *PswStr:需要加密的密码字符串
 *ResultBuff:存放加密后的密码字符串的缓冲区。该值为变参
    *在调用本函数前,需要为这个缓冲区分配足够的内存空间来接受加密后生成的字符串。
 *PswLen:需要加密的密码字符串的长度
 *BuffLen:接受加密后生成的字符串的缓冲区的长度。
    *这个长度不能大于ResultBuff实际拥有的内存空间长度,否则会造成缓冲区溢出而出现调用异常。
 *返回值:
 *32位整数,此值表示的是加密后生成的字符串的实际长度,小于或等于BufferLen。若把返回值赋值给N,
    *而N小于BufferLen则表示ResultBuff缓冲区中只有前面的N个字节是有效的。
    *--------------------------------------------------------------------------------------------
 *function DecryptPswStr(PswStr, ResultBuff: PChar; PswLen, BuffLen: Integer): Integer; stdcall;
 *解密密码字符串
 *参数:
 *PswStr:需要解密的密码字符串
 *ResultBuff:存放解密后的密码字符串的缓冲区。该值为变参
    *在调用本函数前,需要为这个缓冲区分配足够的内存空间来接受解密后生成的字符串。
 *PswLen:需要解密的密码字符串的长度
 *BuffLen:接受解密后生成的字符串的缓冲区的长度。
    *这个长度不能大于ResultBuff实际拥有的内存空间长度,否则会造成缓冲区溢出而出现调用异常。
 *返回值:
 *32位整数,此值表示的是解密后生成的字符串的实际长度,小于或等于BufferLen。若把返回值赋值给N,
    *而N小于BufferLen则表示ResultBuff缓冲区中只有前面的N个字节是有效的。
    *--------------------------------------------------------------------------------------------
 *function NotifyReadMeter(): Integer; stdcall;
 *抄表通知
 *参数:无
 *返回值:
 *32位整数,此值若为零表示抄表通知不成功,可能是抄表软件没有启动、抄表软件版本不正确等等原因。
    *若不为零表示抄表通知已经成功。
    */
 
 /*
  * 加密
  */
  public static final Integer EncryptPswStr(String PswStr, Pointer po,Integer PswLen,Integer BuffLen) throws NativeException, IllegalAccessException{
    /*
  * 方法 一动态连接库的位置是系统目录C:/WINDOWS/system32(在web工程下时路径为 例tomcat/bin)
  * System.loadLibrary("WebInterface");
  * 注意事项如果该项目是web工程时需要将JNativeCpp.dll放到web 服务器的bin中
  * 否则会报java.lang.IllegalStateException: JNative library not loaded, sorry ! 
  * 不是web工程时需要将JNativeCpp.dll放入系统C:/WINDOWS/system32目录中
  */
  System.loadLibrary("WebInterface");//我用的是方法一:WebInterface指的是动态链接库名
  JNative n = null;
  n = new JNative("WebInterface","EncryptPswStr");
  n.setRetVal(Type.INT);//返回类型整型Type.INT  
  int i =0;
  n.setParameter(i++,PswStr);//方法的了内部参数PswStr 为字符(Type.STRING)类型 
  n.setParameter(i++,po);//方法的了内部参数po 为字符(Type.STRING)类型    
  n.setParameter(i++,PswLen);//方法的了内部参数PswLen 为字符(Type.STRING)类型
  n.setParameter(i++,BuffLen);//方法的了内部参数BuffLen 为字符(Type.STRING)类型
  n.invoke();//加载   
  return Integer.parseInt(n.getRetVal());  
    }
  /*
   * 解密
   */
  public static final Integer DecryptPswStr(String PswStr, Pointer po,Integer PswLen,Integer BuffLen) throws NativeException, IllegalAccessException{ 
    /*
  * 方法 一动态连接库的位置是系统目录C:/WINDOWS/system32(在web工程下时路径为 例tomcat/bin)
  * System.loadLibrary("WebInterface");
  * 注意事项如果该项目是web工程时需要将JNativeCpp.dll放到web 服务器的bin中
  * 否则会报java.lang.IllegalStateException: JNative library not loaded, sorry ! 
  * 不是web工程时需要将JNativeCpp.dll放入系统C:/WINDOWS/system32目录中
  */
  System.loadLibrary("WebInterface");//WebInterface指的是动态链接库名
  JNative n = null;
  n = new JNative("WebInterface","DecryptPswStr");//动态连接库内部方法
  n.setRetVal(Type.INT);//返回类型整型Type.INT  
  int i =0;
  n.setParameter(i++,PswStr);//方法的了内部参数PswStr 为字符(Type.STRING)类型 
  n.setParameter(i++,po);//方法的了内部参数po 为字符(Type.STRING)类型    
  n.setParameter(i++,PswLen);//方法的了内部参数PswLen 为字符(Type.STRING)类型
  n.setParameter(i++,BuffLen);//方法的了内部参数BuffLen 为字符(Type.STRING)类型
  n.invoke();//加载    
  return Integer.parseInt(n.getRetVal());  
  }
     /*
      * 十六进制转换成字符
      */
  private static String hex16Str(String theHex) {  
         String theRst = "";  
         byte[] theByte = new byte[theHex.length() / 2];  
   
         try {  
             for (int i = 0; i < theHex.length(); i += 2) {  
                 theByte[i / 2 ] = Integer.decode("0X"+  
                         theHex.substring(i, i + 2)).byteValue();  
             }  
             theRst = new String(theByte, 0, theByte.length, "Shift_JIS"); //Shift_JIS日文编码表 
         } catch (Exception Ue) {  
             Ue.printStackTrace();  
         }  
         return theRst;  
     }  
  /*
      * 转字符换成十六进制
      */
  private static String str16Hex(String theStr) {  
         byte[] bytes;  
         String result = "";  
         int tmp;  
         String tmpStr;  
         try {  
             bytes = theStr.getBytes("Shift_JIS"); //Shift_JIS日文编码表 
             for (int i = 0; i < bytes.length; i++) {  
                 if (bytes[i] < 0) {  
                     tmp = 256 + bytes[i];  
                     tmpStr = Integer.toHexString(tmp).toUpperCase();  
                     result += tmpStr;  
                 } else {  
                     tmpStr = Integer.toHexString(bytes[i]).toUpperCase();                         
                     result += tmpStr.length()==1?"0"+tmpStr:tmpStr;  
                 }  
             }  
         } catch (UnsupportedEncodingException e) {  
             // TODO Auto-generated catch block  
             e.printStackTrace();  
         }  
         return result;  
     }    
  public static void main(String[] args) throws NativeException, IllegalAccessException, SQLException {
  EmployeeInfoDAOImpl eImpl=new EmployeeInfoDAOImpl();//自定义的一个类用于查询验证密码
  String pws="";  
  EmployeeInfo emp=eImpl.selectEmployeeInfo("888");//用户名888返回十六进制编码 
  System.out.println("十六进制编码:0x"+emp.getPass()); 
  
  pws=hex16Str(emp.getPass());  
  System.out.println("字符串组合编码"+pws);
  
  Pointer po1=new Pointer(MemoryBlockFactory.createMemoryBlock(pws.length()));//定义java指针用于解决变参的传递
  Integer PswLen=pws.length();
  Integer BuffLen=pws.length();  
       
  /*
         * 准备解密
         * Dll.DecryptPswStr(字符串, 指针区域"缓冲区", 字符长度, 指针区域"缓冲区"打小)
         */ 
  Dll.DecryptPswStr(pws, po1, PswLen, BuffLen);//解密密码字符串
        System.out.println("解密密码字符串:"+po1.getAsString());  
  
        /*
   * 准别加密
   * Dll.EncryptPswStr(字符串, 指针区域"缓冲区", 字符长度, 指针区域"缓冲区"打小)
   */
        Dll.EncryptPswStr(po1.getAsString(), po1, PswLen, BuffLen);//加密密码字符串
  System.out.println("生成字符串组合编码:"+po1.getAsString());
  System.out.println("字符串转换十六进制编码:0x"+str16Hex(po1.getAsString()));   
  }
 
 
}

你可能感兴趣的:(JAVA)