Problemas com Applet

6 respostas
ronnypeterson

Estou desenvolvendo um sistema web em Ruby para controle de caixa. O cliente tem impressoras não fiscal Bematech, então resolvi desenvolver um applet usando JNA para acessar aos métodos da dll da dita impressora.
Fiz td bonitinho, testei e funcionou no eclipse, porém quando fiz a applet e adicionei no html dá dando um erro:

java.lang.NoClassDefFoundError: Could not initialize class com.sun.jna.Native

at teste.TesteJNA.initialize(TesteJNA.java:29)

at teste.TesteJNA.(TesteJNA.java:19)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

at java.lang.reflect.Constructor.newInstance (Unknown Source)

at java.lang.Class.newInstance0(Unknown Source)

at java.lang.Class.newInstance(Unknown Source)

at sun.applet.AppletPanel.createApplet(Unknown Source)

at sun.plugin.AppletViewer.createApplet (Unknown Source)

at sun.applet.AppletPanel.runLoader(Unknown Source)

at sun.applet.AppletPanel.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)

basic: Exception: java.lang.NoClassDefFoundError : Could not initialize class com.sun.jna.Native

Código da Applet:

package acessaDll;

import java.applet.Applet;

import javax.swing.JOptionPane;

import com.sun.jna.Native;

public class BematechApplet extends Applet
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private AcessaDllBematech lib;
	
	
	public void init() 
	{
		lib = (AcessaDllBematech) Native.loadLibrary("mp2032", AcessaDllBematech.class);		
		JOptionPane.showMessageDialog(null,imprimirTexto(""), "Informação", 0);
	}	
	
	public int imprimirTexto(String texto)
	{	
		//Verifica se tem papel
		switch (lib.VerificaPapelPresenter()) 
		{
			case 1 : 
			{
				if (lib.FormataTX(texto, 2,0,0,0,1) == 0)
				{
					//Retorna erro
					return 0;
				}
				else
				{
					//Retorna OK
					return 1;
				}				
			}
			default : 
			{		
				//Retorna erro
				return 0;
			}			
		}				
	}
	
	public int inicializarImp()
	{
		if (lib.IniciaPorta("LPT1") <= 0) 
		{
			//Problemas ao abrir a porta de comunicação
			return 0;
		}
		else //Sem problema de comunicação
		{			
			if (lib.ConfiguraModeloImpressora(1) == 0)
			{
				//Pârametro inválido
				return 0;
			}
			else //Parâmetro correto
			{		
				//Inicializada com sucesso
				return 1;
			}			
		}				
	}
	
	public int fecharImp()
	{
		if (lib.FechaPorta() == 0)
		{
			//Falha ao fechar a comunicação
			return 0;
		}
		//Se não houver problemas na comunicação
		return 1;
	}	
}

O que pode estar acontecendo?

6 Respostas

M

Dae,

Pelo o pouco que eu sei sobre applet, não é possível o mesmo acessar recursos da máquina. Exemplo porta LPT1, sem criar uma chave de segurança.

Eu testei uma vez no netbeans e funcionou, mas quando adicionei na página e acessei via o navegador ocorria erro.

Da uma procurada no google para criar a chave.

Sds,

ronnypeterson

Já dei uma pesquisada e vi q tem q assinar a applet, mas fiquei mio na dúvida ainda…tenho q pagar p q meu certificado seja reconhecido ou posso usar só o certificado q gerei???
Outro coisa, tenho q alterar as permissões na JVM?

ale-asilva

Bom procure no google sobre o arquivo java.policy, acho que setando as permissões lá você talvez consiga resolver este problema.
Já fiz applets que até gravam dados imagens no disco e não precisei assinar nada.
Mas vale a observação antes do usuário executar o seu arquivo ele precisa gravar este arquivo de policy no computador dele.
Mas uma coisa, certifique-se de quando criar o arquivo, conceder permissão para somente para operações provenientes do domínio do seu aplicativo, para não abrir a máquina do usuário para toda a internet.

Abraço;
Alexandre

T

Olá rp.guimarães, blz??.
Queria saber se você poderia postar o código da sua classe que acessa a DLL MP0232.dll via JNA. Eu também estou tendo que fazer esse esquema de acessar a DLL para imprimir uns comprovantes na MP-2100 TH e gostaria de ter um exemplo que já está funcionando para me ajudar. Também acho que essa classe é um ótimo utilitário para galera, Parabéns! :thumbup:

Valeu!

Abraço!

ronnypeterson

Desculpe o atraso, mas só hoje ver esse codigo de novo depois q um companheiro nosso de guj me passou uma msg privada…se ainda ajudar segue as classes:

P web tive q alterar o java.policy para liberar o acesso d minha aplicação.

package acessaDll;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JOptionPane;

import com.sun.jna.Native;

public class Bematech
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Properties props;
	
	private AcessaDllBematech lib;	
	
	public Bematech() 
	{
		initialize();
	}
	
	public void initialize() 
	{
		lib = (AcessaDllBematech) Native.loadLibrary("mp2032", AcessaDllBematech.class);
		abrirArqConfImp();
		inicializarImp();		
		imprimirTexto("Ronny Peterson Guimarães\nDaniel Freire\nTeste");
		
	}	
	
	public int imprimirTexto(String texto)
	{	
		texto = texto.replace('\n', (char)10);
		//Verifica se tem papel
		switch (lib.VerificaPapelPresenter()) 
		{
			case 1 : 
			{
				/*if (lib.FormataTX(texto, Integer.parseInt(props.getProperty("tipoLetra")), Integer.parseInt(props.getProperty("italico")),Integer.parseInt(props.getProperty("sublinhado")),
				Integer.parseInt(props.getProperty("expandido")), Integer.parseInt(props.getProperty("enfatizado"))) == 0)
				
				if(lib.BematechTX(texto)==0)
				*/
				if (lib.FormataTX(texto, 2, 0, 0, 0, 0) == 0)
				{
					//Retorna erro
					System.out.print("Falhou!");					
					return 0;
				}
				else
				{
					//Retorna OK
					System.out.print("Sucesso!");
					return 1;
				}				
			}
			default : 
			{		
				//Retorna erro
				System.out.print("Falhou!");
				return 0;
			}			
		}				
	}
	
	public int inicializarImp()
	{
		if (lib.IniciaPorta(props.getProperty("porta")) <= 0) 
		{
			//Problemas ao abrir a porta de comunicação
			System.out.print("Falhou!");
			return 0;
		}
		else //Sem problema de comunicação
		{			
			if (lib.ConfiguraModeloImpressora(Integer.parseInt(props.getProperty("modelo"))) == 0)
			{
				//Pârametro inválido
				System.out.print("Falhou!");
				return 0;
			}
			else //Parâmetro correto
			{		
				//Inicializada com sucesso
				System.out.print("Sucesso!");
				return 1;
			}			
		}				
	}
	
	public int fecharImp()
	{
		if (lib.FechaPorta() == 0)
		{
			//Falha ao fechar a comunicação
			return 0;
		}
		//Se não houver problemas na comunicação
		return 1;
	}
	
	/***
	 * Abrir o arquivo de configuração da impressora Bematech
	 */
	private void abrirArqConfImp()
	{	    
		try  
		{
			File file = new File("propriedades/impressora.properties");
			FileInputStream fis = new FileInputStream(file);
			props = new Properties();  
		    props.load(fis);               
		    fis.close();  
		}  
		catch (IOException e)  
		{
			e.printStackTrace();
		} 	
	}
	
}


package acessaDll;

import java.applet.Applet;

import com.sun.jna.Native;

public class BematechApplet extends Applet
{
	private final String porta = "LPT1";
	private final int modelo = 1;
	
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private AcessaDllBematech lib = null;
	
	
	public void init() 
	{
		try 
		{
			System.out.println("loading Bematech dll...");		
			lib = (AcessaDllBematech) Native.loadLibrary("mp2032", AcessaDllBematech.class);
			System.out.println("dll loaded succesfull...");
		} 
		finally
		{
			if (lib.Le_Status() == )
			System.out.println("Erro durante a inicialização da impressora...");
		}
		catch (ExceptionInInitializerError e) 
		{
			System.out.println("Erro durante a inicialização da impressora...");
			System.exit(0);
		}
		
	}	
	
	public int inicializarImp()
	{
		if (lib.IniciaPorta(porta) <= 0) 
		{

			//Problemas ao abrir a porta de comunica&#65533;&#65533;o
			System.out.println("Problemas ao abrir a porta de comunica&#65533;&#65533;o...");
			return 0;
		}
		else //Sem problema de comunica&#65533;&#65533;o
		{			
			if (lib.ConfiguraModeloImpressora(modelo) == 0)
			{
				//P&#65533;rametro inv&#65533;lido
				System.out.println("Modelo de impressora invalido...");
				return 1;
			}
			else //Par&#65533;metro correto
			{		
				//Inicializada com sucesso

				System.out.println("Inicializada com sucesso...");
				return 2;
			}			
		}				
	}
	
	public int imprimirTexto(String texto)
	{				
		texto = texto.replace('\n', (char)10);
		//Verifica se tem papel
		switch (lib.VerificaPapelPresenter()) 
		{
			case 1 : 
			{
				if (lib.FormataTX(texto, 2,0,0,0,0) == 0)
				{
					//Retorna erro
					return 0;
				}
				else
				{
					//Retorna OK
					return 1;
				}				
			}
			default : 
			{		
				//Retorna erro
				return 0;
			}			
		}				
	}	
		
	public int fecharImp()
	{
		if (lib.FechaPorta() == 0)
		{
			//Falha ao fechar a comunica&#65533;&#65533;o
			return 0;
		}
		//Se n&#65533;o houver problemas na comunica&#65533;&#65533;o
		return 1;
	}	
	
}

package acessaDll;

import com.sun.jna.Library;

public interface AcessaDllBematech extends Library
{
	/*Declaração dos métodos da DLL*/
	
	/***
	 * Esta função tem por objetivo retornar o estado da impressora. 
	 * Estes estados são definidos como: ON-LINE, OFF-LINE, Desligada
	 * ou Sem Papel
	 * @return int
	 */
	public int Le_Status();
	
	/***
	 * Esta função tem por objetivo abrir a porta de comunicação, onde 
	 * a impressora está conectada. 
	 * @param String porta 
	 * @return int
	 */
	public int IniciaPorta(String porta);
	
	/***
	 * Esta função tem por objetivo fechar a porta de comunicação, liberando a porta 
	 * para outras atividades 
	 * @return int
	 */
	public int FechaPorta();
	
	/***
	 * Esta função é utilizada para configurar o modelo da impressora não fiscal
	 * em uso
	 * @param int modelo
	 * @return int
	 */
	public int ConfiguraModeloImpressora( int modelo );
	
	/***
	 * Esta função é utilizada na impressão de textos, enviando um conjunto
	 * com várias linhas 
	 * @param String sTexto
	 * @return int
	 */
	public int BematechTX( String sTexto);
	
	/***
	 * Verifica se há papel posicionado no Presenter
	 * @return int
	 */
	public int VerificaPapelPresenter();
		
	/***
	 * Esta função tem por objetivo enviar textos para a impressora, com formatações, 
	 * informadas pelos parâmetros.
	 * TipoLetra:
	 * 1 = comprimido
	 * 2 = normal
	 * 3 = elite
	 * Itálico:
	 * 1 = ativa o modo itálico.
	 * 0 = desativa o modo itálico
	 * Sublinhado:
	 * 1 = ativa o modo sublinhado
	 * 0 = desativa o modo sublinhado
	 * Expandido:
	 * 1 = ativa o modo expandido
	 * 0 = desativa o modo expandido
	 * Enfatizado (negrito):
	 * 1 = ativa o modo enfatizado
	 * 0 = desativa o modo enfatizado
	 * @return int
	 */
	public int FormataTX(String texto, int tipoLetra, int italico, int sublinhado, int expandido, int enfatizado);
	
	

}
prchakal

Olá,

Essa sua solução acho que pode ser útil para mim, pois preciso fazer impressão em impressoras escrevendo direto na porta, sendo que as máquinas do meu cliente não linux(fedora), então não posso usar a dll, preciso arranjar uma outra solução.

Alguém tem algum idéia??

Como faço para usar esse applet ai? Já criei as classes e pacotes como você fez, mas como utilizar ele? Preciso de um applet já existente?

Criado 9 de janeiro de 2008
Ultima resposta 29 de jun. de 2009
Respostas 6
Participantes 5