Jnative callback函数实现

 jnative 1.3.2版本发布了,可以完美支持C回调函数。不过令我很恼火的是还不支持activex dll的调用,问了jnative的作者,他说会在jnative 后继版本支持,大家期待吧!不然要用jacob,在一个项目里面用两种技术,我想任何人都不愿意这样做。
     首先定义一个回调类模板:

Java代码 复制代码
  1. package com.syct.jnative.wrapper;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5. import org.xvolks.jnative.JNative;   
  6. import org.xvolks.jnative.exceptions.NativeException;   
  7.   
  8. import org.xvolks.jnative.util.Callback;   
  9.   
  10. public abstract class DataPackageCallback implements Callback  {   
  11.     private final List<Long> dataPackage;   
  12.        
  13.     public DataPackageCallback() {   
  14.         dataPackage = new ArrayList<Long>();   
  15.     }   
  16.     public List getCallbackDataPackage() {   
  17.   
  18.         ProcessCallbackDataPackage(dataPackage);   
  19.         return dataPackage;   
  20.            
  21.     }   
  22.   
  23.     public int callback(long[] values) {   
  24.         // TODO Auto-generated method stub   
  25.            
  26.         if (values == null) {   
  27.             return 3;   
  28.         }   
  29.         if (values.length == 2) {   
  30.             try {   
  31.                 if (values[0] > 0) {   
  32.                     dataPackage.add(values[0]);   
  33.                     System.out.println(values[1]);   
  34.                 }   
  35.             } catch (Exception e) {   
  36.                 e.printStackTrace();   
  37.             }   
  38.        
  39.             return 1;   
  40.         } else {   
  41.             return 2;   
  42.         }   
  43.     }   
  44.   
  45. //分配内存   
  46.     public int getCallbackAddress() throws NativeException {   
  47.         // TODO Auto-generated method stub   
  48.         return JNative.createCallback(2this);   
  49.     }   
  50. //这个方法在子类实现   
  51.     protected abstract void ProcessCallbackDataPackage(List<Long> dataPackage);   
  52. }  



    然后子类继承:

Java代码 复制代码
  1. package test;   
  2.   
  3. import java.util.List;   
  4.   
  5.   
  6. import org.xvolks.jnative.misc.basicStructures.HWND;   
  7.   
  8. import org.xvolks.jnative.util.User32;   
  9.   
  10. import com.syct.jnative.wrapper.DataPackageCallback;   
  11.   
  12. public class MyEnumCallback extends DataPackageCallback{   
  13.   
  14.     StringBuffer sb=new StringBuffer();   
  15.     public String getWindowEnumList(){   
  16.         return sb.toString();   
  17.     }   
  18.     /**  
  19.      * MyEnumCallback要继承DataPackageCallback  
  20.      * 这个方法得到回调参数的值  
  21.      */  
  22.     @Override  
  23.     protected void ProcessCallbackDataPackage(List<Long> dataPackage) {   
  24.         // TODO Auto-generated method stub   
  25.           
  26.         for (Long key : dataPackage) {   
  27.             try {   
  28.                 //System.err.println("Handle : " + key);   
  29.                 String name = User32.GetWindowText(new HWND(key.intValue()));   
  30.             //  System.err.println("Name : " + name);   
  31.                 if (name == null || name.length() == 0) {   
  32.                 //  System.err.println("Skipping handle " + key);   
  33.                 } else {   
  34.                     sb.append(name).append("/n");   
  35.                 }   
  36.             } catch (Exception e) {   
  37.                 e.printStackTrace();   
  38.             }   
  39.         }   
  40.     }   
  41.   
  42.   
  43.   
  44. }  


     最后测试:

Java代码 复制代码
  1. package test;   
  2.   
  3. import java.io.ByteArrayInputStream;   
  4. import java.io.ByteArrayOutputStream;   
  5. import java.io.IOException;   
  6. import java.io.ObjectInputStream;   
  7. import java.io.ObjectOutputStream;   
  8. import java.io.Serializable;   
  9. import java.security.MessageDigest;   
  10. import java.security.NoSuchAlgorithmException;   
  11.   
  12. import javax.swing.JOptionPane;   
  13.   
  14.   
  15. import org.xvolks.jnative.JNative;   
  16. import org.xvolks.jnative.Type;   
  17. import org.xvolks.jnative.exceptions.NativeException;   
  18. import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;   
  19. import org.xvolks.jnative.util.Callback;   
  20. import org.xvolks.jnative.util.User32;   
  21.   
  22. import com.syct.jnative.wrapper.JNA_TRANS;   
  23. import com.syct.jnative.wrapper.JnaWrapper;   
  24. import com.syct.jnative.wrapper.JnaWrapperHandler;   
  25. import com.syct.jnative.wrapper.JnativeBase;   
  26.   
  27. public class JnativeWrapperTest extends JnativeBase {   
  28.   
  29.     static String DLL_NAME = "Reader_dll";   
  30.     JnaWrapper n = null;   
  31.   
  32.     /**  
  33.      * @JNA_TRANS表明这个方法在JnativeWrapper容器中 由JnativeWrapper自动关闭jnative连接  
  34.      * @return int  
  35.      */  
  36.     @JNA_TRANS  
  37.     public int readerInit() {   
  38.   
  39.         int rev = -1;   
  40.         try {   
  41.             n = super.initJna(DLL_NAME, "ReaderInit");   
  42.             n.setRetVal(Type.INT); // 指定返回参数的类型   
  43.             int i = 0;   
  44.             n.setParameterInt(i++, 0);   
  45.             // 指定串口   
  46.             n.setParameterString(i++, "com1");   
  47.             // 波特率   
  48.             n.setParameterInt(i++, 9600);   
  49.             // 指定usb口   
  50.             n.setParameterString(i++, "usb1"); // 指定位置上的参数类型和值   
  51.             // 调用方法   
  52.             // 0 成功 -1 失败   
  53.             rev = Integer.parseInt(n.getRetVal());   
  54.             if (rev == 0) {   
  55.                 System.out.println("==============初始化识读头的串口成功==============");   
  56.             } else if (rev == -1) {   
  57.                 System.out.println("==============初始化识读头的串口失败==============");   
  58.             }   
  59.         } catch (Exception e) {   
  60.             // TODO Auto-generated catch block   
  61.             e.printStackTrace();   
  62.         }   
  63.         return rev;   
  64.     }   
  65.   
  66.     /**  
  67.      * @JNA_TRANS表明这个方法在JnativeWrapper容器中 由JnativeWrapper自动关闭jnative连接  
  68.      * @return boolean  
  69.      */  
  70.   
  71.     @JNA_TRANS  
  72.     public boolean EnumWindows(Callback lpEnumFunc, int lParam)   
  73.             throws NativeException, IllegalAccessException {   
  74.         n = super.initJna("User32.dll""EnumWindows");   
  75.         n.setRetVal(Type.INT);   
  76.   
  77.         n.setParameterCallback(0, lpEnumFunc.getCallbackAddress());   
  78.         n.setParameterInt(1, lParam);   
  79.         ;   
  80.         return !"0".equals(n.getRetVal());   
  81.     }   
  82.   
  83.     public void testCallback() {   
  84.         try {   
  85.             User32.MessageBox(0"Callback Demo""JNative"0);   
  86.         } catch (NativeException e1) {   
  87.             // TODO Auto-generated catch block   
  88.             e1.printStackTrace();   
  89.         } catch (IllegalAccessException e1) {   
  90.             // TODO Auto-generated catch block   
  91.             e1.printStackTrace();   
  92.         }   
  93.         MyEnumCallback c = new MyEnumCallback();   
  94.   
  95.         try {   
  96.             MemoryBlockFactory.createMemoryBlock(1).dispose();   
  97.             if (EnumWindows(c, 0)) {   
  98.                 System.err.println("EnumWindows suceeded");   
  99.             } else {   
  100.                 System.err.println("EnumWindows failed");   
  101.             }   
  102.             System.err.println("getAvailableCallbacks "  
  103.                     + JNative.getAvailableCallbacks());   
  104.             JNative.releaseCallback(c);   
  105.             System.err.println(c.getCallbackDataPackage());   
  106.             User32.MessageBox(0, c.getWindowEnumList(), "窗体枚举(EnumWindows)"0);   
  107.             JOptionPane.showMessageDialog(null, c.getWindowEnumList(),   
  108.                     "窗体枚举(EnumWindows)", JOptionPane.OK_OPTION);   
  109.   
  110.         } catch (NativeException e) {   
  111.             // TODO Auto-generated catch block   
  112.             e.printStackTrace();   
  113.         } catch (IllegalAccessException e) {   
  114.             // TODO Auto-generated catch block   
  115.             e.printStackTrace();   
  116.         }   
  117.   
  118.     }   
  119.   
  120.     private interface MyFactory {   
  121.         public Object newInstance(int a, char[] b, String d);   
  122.     }   
  123.   
  124.     public static void main(String[] args) {   
  125.         /**  
  126.          * JnativeWrapperTest 要继承JnativeBase 通过JnaWrapperProxy返回一个代理实例  
  127.          */  
  128.          JnativeWrapperTest   
  129.          test=(JnativeWrapperTest)JnaWrapperHandler.getJnaWrapperProxy(JnativeWrapperTest.class);   
  130.         // test.readerInit();   
  131.           test.testCallback();   
  132.   
  133.     }   
  134.   
  135. }  

你可能感兴趣的:(exception,String,user,null,dll,callback)