读书人

jnative callback 回调函数的兑现

发布时间: 2012-11-03 10:57:44 作者: rapoo

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


最后测试:
package test;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import javax.swing.JOptionPane;import org.xvolks.jnative.JNative;import org.xvolks.jnative.Type;import org.xvolks.jnative.exceptions.NativeException;import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;import org.xvolks.jnative.util.Callback;import org.xvolks.jnative.util.User32;import com.syct.jnative.wrapper.JNA_TRANS;import com.syct.jnative.wrapper.JnaWrapper;import com.syct.jnative.wrapper.JnaWrapperHandler;import com.syct.jnative.wrapper.JnativeBase;public class JnativeWrapperTest extends JnativeBase {static String DLL_NAME = "Reader_dll";JnaWrapper n = null;/** * @JNA_TRANS表明这个方法在JnativeWrapper容器中 由JnativeWrapper自动关闭jnative连接 * @return int */@JNA_TRANSpublic int readerInit() {int rev = -1;try {n = super.initJna(DLL_NAME, "ReaderInit");n.setRetVal(Type.INT); // 指定返回参数的类型int i = 0;n.setParameterInt(i++, 0);// 指定串口n.setParameterString(i++, "com1");// 波特率n.setParameterInt(i++, 9600);// 指定usb口n.setParameterString(i++, "usb1"); // 指定位置上的参数类型和值// 调用方法// 0 成功 -1 失败rev = Integer.parseInt(n.getRetVal());if (rev == 0) {System.out.println("==============初始化识读头的串口成功==============");} else if (rev == -1) {System.out.println("==============初始化识读头的串口失败==============");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return rev;}/** * @JNA_TRANS表明这个方法在JnativeWrapper容器中 由JnativeWrapper自动关闭jnative连接 * @return boolean */@JNA_TRANSpublic boolean EnumWindows(Callback lpEnumFunc, int lParam)throws NativeException, IllegalAccessException {n = super.initJna("User32.dll", "EnumWindows");n.setRetVal(Type.INT);n.setParameterCallback(0, lpEnumFunc.getCallbackAddress());n.setParameterInt(1, lParam);;return !"0".equals(n.getRetVal());}public void testCallback() {try {User32.MessageBox(0, "Callback Demo", "JNative", 0);} catch (NativeException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IllegalAccessException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}MyEnumCallback c = new MyEnumCallback();try {MemoryBlockFactory.createMemoryBlock(1).dispose();if (EnumWindows(c, 0)) {System.err.println("EnumWindows suceeded");} else {System.err.println("EnumWindows failed");}System.err.println("getAvailableCallbacks "+ JNative.getAvailableCallbacks());JNative.releaseCallback(c);System.err.println(c.getCallbackDataPackage());User32.MessageBox(0, c.getWindowEnumList(), "窗体枚举(EnumWindows)", 0);JOptionPane.showMessageDialog(null, c.getWindowEnumList(),"窗体枚举(EnumWindows)", JOptionPane.OK_OPTION);} catch (NativeException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private interface MyFactory {public Object newInstance(int a, char[] b, String d);}public static void main(String[] args) {/** * JnativeWrapperTest 要继承JnativeBase 通过JnaWrapperProxy返回一个代理实例 */ JnativeWrapperTest test=(JnativeWrapperTest)JnaWrapperHandler.getJnaWrapperProxy(JnativeWrapperTest.class);// test.readerInit();  test.testCallback();}}
1 楼 hyint 2009-02-16 哥们,你的这个帖子,还是有点不明白啊!我想请教你一些问题,希望你能帮帮忙啊!我的QQ:51563163

读书人网 >软件架构设计

热点推荐