Java llama a la demostración de la biblioteca dinámica dll a través de JNA y genera el tutorial detallado del archivo jar correspondiente

Java llama a bibliotecas dinámicas a través de JNA

  Escriba un programa de demostración y use JNA para llamar a la biblioteca dinámica zpl importando el paquete jar JNA para completar las funciones de abrir el puerto de la impresora zpl, cerrar el puerto, imprimir texto, códigos de barras y códigos QR.

1: Descargue el paquete jar Jna e importe el archivo del paquete jar al proyecto

  Al descargar la versión correspondiente del archivo del paquete jar del almacén mvn, este proyecto descarga el paquete jar 5.5.0 y luego coloca el paquete jar en el directorio del proyecto. Es muy importante prestar atención a la ubicación donde se encuentra el paquete jar. ¡está almacenado! Al principio, solo coloqué el paquete jar en el directorio raíz, lo que provocó una excepción NOCLASSFOUND al llamar a clases en la biblioteca jna más adelante en el proyecto, lo que me preocupó durante mucho tiempo. Por lo tanto, es importante almacenar e importar jar. paquetes en el proyecto de forma estandarizada.
  Primero, cree un nuevo archivo lib en el directorio raíz del proyecto y almacene el paquete jar en la carpeta lib.
Insertar descripción de la imagen aquí
  Agregue el paquete jar a la ruta de compilación. Haga clic con el botón derecho en el paquete jar utilizado y seleccione Ruta de compilación–>Agregar a ruta de compilación.
Insertar descripción de la imagen aquí   En este momento, hay un directorio de bibliotecas referenciado adicional en el directorio del proyecto, y el paquete jar que acaba de agregar está en este directorio, por lo que el paquete jar realmente se agrega al proyecto.
Insertar descripción de la imagen aquí

2: escribir clase de interfaz

  Si desea llamar a la biblioteca dinámica DLL a través de JNA, debe crear una nueva clase de interfaz para exportar los métodos de la biblioteca dinámica DLL.
  Primero, importe una serie de clases en el paquete JNA para cargar la biblioteca dinámica dll y complete la conversión de la función java y el método de la función c en la biblioteca dinámica y el mapeo de tipos de los miembros de parámetros formales correspondientes. El c específico -> El mapeo de Java se muestra en la siguiente figura.
![Inserte descripción de la imagen aquí](https://img-blog.csdnimg.cn/41e50027459f4b929be07faa67a741da.pngInsertar descripción de la imagen aquí

  Tenga en cuenta que todos los métodos Java anteriores convierten y asignan las funciones que deben usarse en la biblioteca dll en los métodos de función Java correspondientes para que el programa Java pueda llamar al método. Si solo tiene la biblioteca dinámica correspondiente pero no tiene el código fuente y no puede conocer los métodos en la biblioteca dinámica, puede usar el siguiente método para ver los métodos en la biblioteca dinámica dll.
Insertar descripción de la imagen aquí

  La siguiente figura es la tabla de conversión entre el tipo de datos del parámetro de función C correspondiente y el tipo de datos del parámetro formal de Java.
Insertar descripción de la imagen aquí

   A través de la implementación anterior, se puede completar la llamada de la biblioteca dinámica dll y la conversión de las funciones de la biblioteca dll correspondientes en métodos java.

Escriba un programa de demostración para implementar la llamada de funciones de biblioteca dinámicas

  Esto requiere llamar a la clase de control Java para completar el dibujo de la interfaz GUI. El código específico es el siguiente. Las llamadas a funciones se pueden implementar importando la clase de interfaz anterior y llamando a los métodos de los miembros de la instancia en la clase de interfaz.
Insertar descripción de la imagen aquí
   Al llamar a la función de la biblioteca dinámica dll, debe prestar atención a si hay algún error en el reemplazo de parámetros. Esto debe verificarse con mucho cuidado, de lo contrario habrá muchos problemas al llamar a través de Java más adelante. Algunos de ellos pueden romperse cuando la cantidad La cantidad de código aumenta más adelante. Es difícil solucionar problemas, por lo que debe verificarlo cuidadosamente cuando consulte la tabla de mapeo c -> java. Todavía hay algunas asignaciones de tipos de datos que aún no se han mencionado. Resumiré la biblioteca dinámica específica Llamo al reemplazo del tipo de datos más tarde, cuando tenga la oportunidad.

Problemas que ocurrieron en proyectos específicos:
    Al llamar a la función de impresión para imprimir texto, se encontró que la llamada fue exitosa, pero la impresora no imprimió, luego se descubrió que es necesario agregar una función de etiqueta antes y después de la impresión. función para configurar las etiquetas de inicio y fin antes de que pueda comenzar la impresión normal.
   Se produjo un problema de formato de codificación al imprimir texto y códigos de barras, lo que provocó que los datos impresos fueran confusos. Después de verificar, se encontró que el tipo de datos de entrada debía cambiarse a WString y se pudo imprimir correctamente después del cambio.

package PrinterSdk;
import com.sun.jna.WString;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.UnsupportedEncodingException;
import PrinterSdk.DllUse;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import com.sun.jna.ptr.IntByReference;
public class PrinterDemo {
    
    
    private JFrame frame;
    private JTextField barcode_data;
    private JTextField qrcode_data;
    private JTextField Text;
    private JButton PrBar_btn;
    private JButton PrQr_btn;
    private JButton PrTx_btn;
    private JButton openPort_btn;
    private JButton closePort_btn;
    
    private  int port;
    
    public PrinterDemo()
    {
    
    
        initialize();
    }
    
    private void initialize()
    {
    
    
        frame=new JFrame();
        frame.setBounds(100, 100, 700, 550);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.setTitle("PrinterDemo");
        
        PrTx_btn=new JButton("打印文本");
        PrTx_btn.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                // TODO Auto-generated method stub
                try {
    
    
//                    IntByReference i=new IntByReference(0);
//                    int o1=DllUse.instanceDll.OpenPortEx(0, i, 9600, 0);
                    WString data = new WString(Text.getText().toString());//.getBytes("gb18030");
//                    int s=DllUse.instanceDll.StartFormat_ZPL(100,100,10000,100);
                    int o=DllUse.instanceDll.StartData_ZPL(2000, 2000);
//                    DllUse.instanceDll.SetDefaultFont_ZPL(o1, "D".getBytes("gb18030"), 9, 5);
//                    DllUse.instanceDll.SetDataFont_ZPL("C".getBytes("gb18030"), 10000, 10000, "N".getBytes("gb18030"));
//                    DllUse.instanceDll.DataOrientation_ZPL("N".getBytes("gb18030"));
                    String data1="no.1234567";
    //                byte[] data2=data1.getBytes("gb18030");
                    int s=DllUse.instanceDll.StartFormat_ZPL(200,200,40039,40039);
                    int i1=DllUse.instanceDll.PrintData_ZPL(data);
                    DllUse.instanceDll.EndFormat_ZPL(port);
                    System.out.println("文本:"+i1+" "+s);
//                    int status=DllUse.instanceDll.GetPrintStatues_USB(0);
//                    System.out.println("打印机状态:"+status);
                } catch (Exception e1) {
    
    
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
        PrTx_btn.setBounds(500, 100, 100, 80);
        frame.getContentPane().add(PrTx_btn);
        
        PrBar_btn=new JButton("打印条码");
        PrBar_btn.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                // TODO Auto-generated method stub
                try {
    
    
//                    IntByReference i1=new IntByReference(0);
//                    int o1=DllUse.instanceDll.OpenPortEx(0, i1, 9600, 0);
                    DllUse.instanceDll.DataOrientation_ZPL("N".getBytes("gb18030"));
                    WString data = new WString(barcode_data.getText().toString());
                    WString data1 = new WString("Y");
//                    byte[] data=barcode_data.getText().getBytes("gb18030");
//                    CodeType type=CodeType.CODE_39;
//                    System.out.println(type);
                    int s1=DllUse.instanceDll.StartFormat_ZPL(200,200,40039,10000);
                    int i=DllUse.instanceDll.BarCode_ZPL(data,2, 100, data1);
                    DllUse.instanceDll.EndFormat_ZPL(port);
                    System.out.println("条码:"+i);
                } catch (UnsupportedEncodingException e1) {
    
    
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                
            }
        });
        PrBar_btn.setBounds(500, 200, 100, 80);
        frame.getContentPane().add(PrBar_btn);
        
        PrQr_btn=new JButton("打印二维码");
        PrQr_btn.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                // TODO Auto-generated method stub
                try {
    
    
//                    IntByReference i1=new IntByReference(0);
//                    int o1=DllUse.instanceDll.OpenPortEx(0, i1, 9600, 0);
//                    int s1=DllUse.instanceDll.StartFormat_ZPL(10,10,100,100);
                    DllUse.instanceDll.DataOrientation_ZPL("N".getBytes("gb18030"));
                    WString data = new WString(qrcode_data.getText().toString());
//                    byte[] data=qrcode_data.getText().getBytes("gb18030");
                    int s=DllUse.instanceDll.StartFormat_ZPL(200,200,40039,10000);
                    int i=DllUse.instanceDll.QRCode_ZPL(data, "M".getBytes("gb18030"), 2, 8);
                    System.out.println("二维码:"+i+" "+s);
                    DllUse.instanceDll.EndFormat_ZPL(port);
                } catch (UnsupportedEncodingException e1) {
    
    
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
        PrQr_btn.setBounds(500,300,100,80);
        frame.getContentPane().add(PrQr_btn);
        
        openPort_btn=new JButton("open port");
        openPort_btn.addActionListener(new ActionListener() {
    
        
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                // TODO Auto-generated method stub
                IntByReference i=new IntByReference(0);
                port=DllUse.instanceDll.OpenPortEx(0, i, 9600, 0);
                System.out.println("打开端口:"+port);
            }
        });
        openPort_btn.setBounds(100, 170, 100, 40);
        frame.getContentPane().add(openPort_btn);
        
        closePort_btn=new JButton("close port");
        closePort_btn.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                // TODO Auto-generated method stub
                DllUse.instanceDll.ClosePort(port);
            }
        });
        closePort_btn.setBounds(100, 270, 100, 40);
        frame.getContentPane().add(closePort_btn);
        
        Text=new JTextField();
        Text.setBounds(300,120,150,40);
        frame.getContentPane().add(Text);
        Text.setColumns(10);
        
        barcode_data=new JTextField();
        barcode_data.setBounds(300,220,150,40);
        frame.getContentPane().add(barcode_data);
        barcode_data.setColumns(10);
        
        qrcode_data=new JTextField();
        qrcode_data.setBounds(300,320,150,40);
        frame.getContentPane().add(qrcode_data);
        qrcode_data.setColumns(10);
    }
    
    public static void main(String[] args) {
    
    
            PrinterDemo window=new PrinterDemo();
            window.frame.setVisible(true);
    }
}

Insertar descripción de la imagen aquí
  El programa javaDemo se ejecutó correctamente y se llamó correctamente a la biblioteca dinámica correspondiente.

Empaquetar el programa java en un archivo jar

Método 1:
cree un nuevo archivo MANIFEST.MF en el directorio raíz del proyecto.
Insertar descripción de la imagen aquí
El contenido del archivo es:
Insertar descripción de la imagen aquí
  Se requiere un espacio al comienzo de MAIN-CLASSK, luego escriba el nombre absoluto de la clase principal donde se encuentra el método principal. y finalmente presione Enter para dejar la cuarta línea vacía.
  Haga clic en el archivo del proyecto para seleccionar exportar, ingrese jar y seleccione el archivo JAR.
Insertar descripción de la imagen aquí
  Seleccione el programa Java y el paquete de terceros que desea exportar y seleccione la ubicación del paquete jar que se exportará y el nombre del paquete jar en el campo del archivo JAR.
Insertar descripción de la imagen aquí

  • Exportar archivos de clase y recursos generados significa exportar solo los archivos .class generados y otros archivos de recursos.
  • Exportar todas las carpetas de salida para los proyectos marcados significa exportar todas las carpetas de los proyectos seleccionados.
  • Exportar archivos fuente y recursos de Java significa que el paquete jar exportado contendrá su código fuente *.java. Si no desea filtrar el código fuente, no seleccione esta opción.
  • Exportar refactorizaciones para proyectos verificados incluye algunos archivos de información de refactorización


  Luego seleccione el archivo MANIFEST que creó y haga clic en finalizar.
Insertar descripción de la imagen aquí
Método 2:
elija exportar el frasco ejecutable.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
La explicación de la parte de manejo de la biblioteca es la siguiente:

(1) Extraiga las bibliotecas necesarias en el JAR generado.
Desmonte todos los JAR de importación e inclúyalos en cada directorio del JAR, por ejemplo, net/org/xxx.class

(2) Empaquetar las bibliotecas necesarias en el JAR generado.
Empaquete todos los JAR de importación en el directorio raíz del JAR

(3) Copie las bibliotecas necesarias en una subcarpeta junto al JAR generado.
Coloque todos los JAR de importación en una carpeta separada fuera de los JAR.

A través de los dos métodos anteriores, el programa Java se puede empaquetar en un archivo jar y se puede llamar al archivo jar a través de la terminal para ejecutar el programa.

Supongo que te gusta

Origin blog.csdn.net/ccjjjjdff/article/details/129561807
Recomendado
Clasificación