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:
packageacessaDll;importjava.applet.Applet;importjavax.swing.JOptionPane;importcom.sun.jna.Native;publicclassBematechAppletextendsApplet{/** * */privatestaticfinallongserialVersionUID=1L;privateAcessaDllBematechlib;publicvoidinit(){lib=(AcessaDllBematech)Native.loadLibrary("mp2032",AcessaDllBematech.class);JOptionPane.showMessageDialog(null,imprimirTexto(""),"Informação",0);}publicintimprimirTexto(Stringtexto){//Verifica se tem papelswitch(lib.VerificaPapelPresenter()){case1:{if(lib.FormataTX(texto,2,0,0,0,1)==0){//Retorna erroreturn0;}else{//Retorna OKreturn1;}}default:{//Retorna erroreturn0;}}}publicintinicializarImp(){if(lib.IniciaPorta("LPT1")<=0){//Problemas ao abrir a porta de comunicaçãoreturn0;}else//Sem problema de comunicação{if(lib.ConfiguraModeloImpressora(1)==0){//Pârametro inválidoreturn0;}else//Parâmetro correto{//Inicializada com sucessoreturn1;}}}publicintfecharImp(){if(lib.FechaPorta()==0){//Falha ao fechar a comunicaçãoreturn0;}//Se não houver problemas na comunicaçãoreturn1;}}
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
tiagostutz
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.
packageacessaDll;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.util.Properties;importjavax.swing.JOptionPane;importcom.sun.jna.Native;publicclassBematech{/** * */privatestaticfinallongserialVersionUID=1L;privatePropertiesprops;privateAcessaDllBematechlib;publicBematech(){initialize();}publicvoidinitialize(){lib=(AcessaDllBematech)Native.loadLibrary("mp2032",AcessaDllBematech.class);abrirArqConfImp();inicializarImp();imprimirTexto("Ronny Peterson Guimarães\nDaniel Freire\nTeste");}publicintimprimirTexto(Stringtexto){texto=texto.replace('\n',(char)10);//Verifica se tem papelswitch(lib.VerificaPapelPresenter()){case1:{/*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 erroSystem.out.print("Falhou!");return0;}else{//Retorna OKSystem.out.print("Sucesso!");return1;}}default:{//Retorna erroSystem.out.print("Falhou!");return0;}}}publicintinicializarImp(){if(lib.IniciaPorta(props.getProperty("porta"))<=0){//Problemas ao abrir a porta de comunicaçãoSystem.out.print("Falhou!");return0;}else//Sem problema de comunicação{if(lib.ConfiguraModeloImpressora(Integer.parseInt(props.getProperty("modelo")))==0){//Pârametro inválidoSystem.out.print("Falhou!");return0;}else//Parâmetro correto{//Inicializada com sucessoSystem.out.print("Sucesso!");return1;}}}publicintfecharImp(){if(lib.FechaPorta()==0){//Falha ao fechar a comunicaçãoreturn0;}//Se não houver problemas na comunicaçãoreturn1;}/*** * Abrir o arquivo de configuração da impressora Bematech */privatevoidabrirArqConfImp(){try{Filefile=newFile("propriedades/impressora.properties");FileInputStreamfis=newFileInputStream(file);props=newProperties();props.load(fis);fis.close();}catch(IOExceptione){e.printStackTrace();}}}packageacessaDll;importjava.applet.Applet;importcom.sun.jna.Native;publicclassBematechAppletextendsApplet{privatefinalStringporta="LPT1";privatefinalintmodelo=1;/** * */privatestaticfinallongserialVersionUID=1L;privateAcessaDllBematechlib=null;publicvoidinit(){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(ExceptionInInitializerErrore){System.out.println("Erro durante a inicialização da impressora...");System.exit(0);}}publicintinicializarImp(){if(lib.IniciaPorta(porta)<=0){//Problemas ao abrir a porta de comunica��oSystem.out.println("Problemas ao abrir a porta de comunica��o...");return0;}else//Sem problema de comunica��o{if(lib.ConfiguraModeloImpressora(modelo)==0){//P�rametro inv�lidoSystem.out.println("Modelo de impressora invalido...");return1;}else//Par�metro correto{//Inicializada com sucessoSystem.out.println("Inicializada com sucesso...");return2;}}}publicintimprimirTexto(Stringtexto){texto=texto.replace('\n',(char)10);//Verifica se tem papelswitch(lib.VerificaPapelPresenter()){case1:{if(lib.FormataTX(texto,2,0,0,0,0)==0){//Retorna erroreturn0;}else{//Retorna OKreturn1;}}default:{//Retorna erroreturn0;}}}publicintfecharImp(){if(lib.FechaPorta()==0){//Falha ao fechar a comunica��oreturn0;}//Se n�o houver problemas na comunica��oreturn1;}}packageacessaDll;importcom.sun.jna.Library;publicinterfaceAcessaDllBematechextendsLibrary{/*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 */publicintLe_Status();/*** * Esta função tem por objetivo abrir a porta de comunicação, onde * a impressora está conectada. * @param String porta * @return int */publicintIniciaPorta(Stringporta);/*** * Esta função tem por objetivo fechar a porta de comunicação, liberando a porta * para outras atividades * @return int */publicintFechaPorta();/*** * Esta função é utilizada para configurar o modelo da impressora não fiscal * em uso * @param int modelo * @return int */publicintConfiguraModeloImpressora(intmodelo);/*** * Esta função é utilizada na impressão de textos, enviando um conjunto * com várias linhas * @param String sTexto * @return int */publicintBematechTX(StringsTexto);/*** * Verifica se há papel posicionado no Presenter * @return int */publicintVerificaPapelPresenter();/*** * 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 */publicintFormataTX(Stringtexto,inttipoLetra,intitalico,intsublinhado,intexpandido,intenfatizado);}
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?