发新话题
移动帖子 加入精华 加入置顶 加入收藏 关注此帖

使用JNative对条码打印机进行打印



使用JNative对条码打印机进行打印

因项目需要,对Godex EZ2300条码机进行调用打印, 驱动为Ez2000.dll, 用JNI可以实现调用,但比较麻烦, 需

要用到VC6进行DLL封装,改用JNative组件进行调用, 步骤如下:

1. 下载JNative-1.3.2.zip组件库

2. 解压出来后有JNative.jar / JNativeCpp.dll / libJNativeCpp.so三个文件,JNative.jar置于%JAVA_HOME%/jre/lib/ext目录下, JNativeCpp.dll置于%SYSTEM%/WINDOWS/SYSTEM32目录下

3.将Ez2000.dll置于%SYSTEM%/WINDOWS/SYSTEM32目录以及%JAVA_HOME%/jdk/bin目录下

4. 具体Java代码如下:
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;

public class Demo {
  private static final String PRINTER_DLL = "Ez2000.dll";

  public static void main(String[] args) {
    Demo demo = new Demo();
    System.loadLibrary("Ez2000");
    JNative n = null;
    try {
      n = demo.getJNativeByFunction("isready");
      n.setRetVal(Type.INT);
      // n.setParameter(1, Type.VOID, "");
      n.invoke();
      Integer isready = Integer.parseInt(n.getRetVal());
      if (isready == 1) {
        System.out.println("条码机可以开始接收资料!Starting...");
        System.out.println("Starting...");
        // 打开端口
        n = demo.getJNativeByFunction("openport");
        n.setParameter(0, Type.STRING, "0");
        n.invoke();
        // 设定参数
        n = demo.getJNativeByFunction("setup");
        n.setRetVal(Type.INT);
        n.setParameter(0, Type.INT, "30");
        n.setParameter(0, Type.INT, "7");
        n.setParameter(0, Type.INT, "2");
        n.setParameter(0, Type.INT, "1");
        n.setParameter(0, Type.INT, "0");
        n.setParameter(0, Type.INT, "0");
        n.invoke();
        // 发出指令
        n = demo.getJNativeByFunction("sendcommand");
        n.setRetVal(Type.INT);
        n.setParameter(0, Type.STRING, "W70");
        n.invoke();
        n.setRetVal(Type.INT);
        n.setParameter(0, Type.STRING, "^P1");
        n.invoke();
        n.setRetVal(Type.INT);
        n.setParameter(0, Type.STRING, "^L");
        n.invoke();
        n.setRetVal(Type.INT);
        n.setParameter(0, Type.STRING, "AC,20,60,1,1,1,0,TEST");
        n.invoke();
        // 发送条形码
        n = demo.getJNativeByFunction("ecTextOut");
        n.setParameter(0, Type.INT, "20");
        n.setParameter(1, Type.INT, "10");
        n.setParameter(2, Type.INT, "34");
        n.setParameter(3, Type.STRING, "标楷体");
        n.setParameter(4, Type.STRING, "Athens Testing Successlly!!!");
        n.invoke();
        // 发出指令
        n = demo.getJNativeByFunction("sendcommand");
        n.setRetVal(Type.INT);
        n.setParameter(0, Type.STRING, "E");
        n.invoke();
        // 关闭端口
        n = demo.getJNativeByFunction("closeport");
        n.invoke();
        System.out.println("Ending...");
      } else {
        System.out.println("条码机无法接收资料!");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (n != null) {
        try {
          n.dispose();
        } catch (NativeException e) {
          e.printStackTrace();
        } catch (IllegalAccessException e) {
          e.printStackTrace();
        }
      }
    }
  }

  // 通过方法名取得JNative对象
  public JNative getJNativeByFunction(String functionName) throws NativeException {
    return new JNative(PRINTER_DLL, functionName);
  }
}
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP

Re:使用JNative对条码打印机进行打印

老师,您好!
因为要操作硬件,所以透过JNative调用C方法.
C生成的DLL方法如下: getVPID(PUSHORT id,PUSHORT id2)
使有JNative,PUSHORT类型,java应该丢什么参数进去?
我的写法如下
 short vid = 0;
 short pid = 0;
 ointer pvid = new Pointer(MemoryBlockFactory.createMemoryBlock(6));
 pvid.setShortAt(0, vid);
 ointer ppid = new Pointer(MemoryBlockFactory.createMemoryBlock(6));
 ppid .setShortAt(0, pid);
但是会报错,
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x030512ee, pid=5372, tid=4904
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_15-b04 mixed mode, sharing)
# Problematic frame:
# C [U3sDll.dll+0x12ee]
#
# An error report file with more information is saved as hs_err_pid5372.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

 
编辑 回复 快速回复 TOP

Re:使用JNative对条码打印机进行打印

更新你的JDK/JRE版本
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP
发新话题