APPLET + JNA = PROBLEMA... alguém sabe? [RESOLVIDO]

4 respostas
J

Pessoal, desenvolvi um applet.
Ele acessa dll’s via JNA.
Eu assinei meu applet e alterei as configurações do arquivo .policy e funcionou perfeitamente.
Mas ainda tenho um problema com ele.
Eu preciso distribuir ele na net, então eu fiz um sisteminha de download das dll’s e assinei neu applet mas simplesmente não funciona.
Essa é minha mensagem de erro:

Exception in thread Thread-9 java.lang.ExceptionInInitializerError

at com.se.serial.GageValue$2.run(GageValue.java:77)

at java.security.AccessController.doPrivileged(Native Method)

at com.se.serial.GageValue.run(GageValue.java:73)

at com.se.serial.Serial.getGageValue(Serial.java:299)

at com.se.serial.Serial$1.run(Serial.java:144)

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

Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.jnidispatch)

at java.security.AccessControlContext.checkPermission(Unknown Source)

at java.security.AccessController.checkPermission(Unknown Source)

at java.lang.SecurityManager.checkPermission(Unknown Source)

at java.lang.SecurityManager.checkLink(Unknown Source)

at java.lang.Runtime.loadLibrary0(Unknown Source)

at java.lang.System.loadLibrary(Unknown Source)

at com.sun.jna.Native.(Native.java:86)

 6 more

Meu applet tem 2 classes e uma interface.
o código que busca os valores da dll é o seguinte:

public void run() {
	java.security.AccessController.doPrivileged(new java.security.PrivilegedAction(){
    	public Object run(){
    		returnStatus = 1;
        	try{
        		lib = (IntSerial) Native.loadLibrary("IntSerial", IntSerial.class);
    	        status = false;            
    	        lib.setConfiguration(comPort, parity, baudRate, dataBits, stopBits, driver);
    	        IntByReference retStatus = new IntByReference();
    	        result = lib.getValue(gage, comPort, driver, remoteConnection, idAddress,retStatus);//[color=red][i][b]<--aqui ocorre o erro[/b][/i][/color] - linha 73
    	        returnStatus = retStatus.getValue();
    	        status = true;
        	}catch (Exception e) {
    			e.printStackTrace();
    		}
        	return null;
    	}
	});
}

Gostaria muito de receber alguma ajuda. :smiley:

4 Respostas

T

Um problema sério com applets é que o classloading delas não é adequado para o uso com JNI. A única forma que vi para o JNI funcionar direito em applets é:

  • Faça uma DLL JNI e a ponha em c:\windows\system32
  • Copie o JAR que está associado a essa DLL JNI em jre\lib\ext (da JRE que está associada a essa applet)
  • E obviamente assine a applet.

Ou seja, isso precisa obrigatoriamente de ter um instalador nativo para copiar esse código para esses diretórios. Não dá para fazer 100% java porque você precisa ter poderes de administrador para fazer essas cópias nesses diretórios , e isso não é possível fazer no Windows Vista, mesmo logado como administrador da máquina.

Não sei como o classloading do JNA funciona; talvez ele impossibilite seu uso em applets, mas é questão de testar.

J

thingol, brigadão, consegui resolver o problema depois de quase ficar maluco com isso… hehehe

A solução é assinar o pacote da jna também ou colocar as classes do jna dentro do seu pacote .jar e assina-lo.
assim você conseguirá usar jna com applets.

Um grande abraço e obrigado a todos

T

Veja se há algum problema quando você dá um “reload” no applet nessa página.
Eu fiquei doido com isso até que descobri esses problemas de classloading.

J

Thingol, eu tive esse problema sim… fiquei maluco com ele… me deixava doido mesmo… mas minha solução trabalha mais ou menos assim…
applet -> jna->dll regra negócio - > dll acesso à porta serial.

Consegui resolver esse problema(depois de perder alguns cabelos) fazendo com que minha “dll regra negócio” carregasse uma instancia da “dll acesso à porta serial” cada vez que fosse acessar a porta serial e depois limpasse ela da memória pois era na dll que acessava a porta serial que me dava problema.

Bem, eu não havia descoberto o problema embora tenha feito um Work-Around, mas fico feliz que vc tenha acabado de me dizer qual era.

Aprendi mais algo agora…

Mas agora está funcionando…
Muito obrigado Mesmo.

Criado 11 de fevereiro de 2008
Ultima resposta 11 de fev. de 2008
Respostas 4
Participantes 2