applet. java.lang.reflect.InvocationTargetException

Eu tenho applet que usam jna class Pointer. O código do applet é:

import com.sun.jna.*; public class Applet1 extends Applet{ public void test() { try { Pointer p = new Memory(73); } catch (Exception e) { e.printStackTrace(); } } } 

Em código html, declarei applet dessa maneira:

   

Quando eu chamo document.getElementById (“Applet1”). Test () por javascript o java.lang.reflect.InvocationTargetException surgir. Eu não posso chamar e.getCause () no lado da class java, porque o applet try / catch não captura o erro (eu não entendo o porquê). Mas javascript tente / pegar pegar esse erro. Se mover o Pointer p = new Memory(73); linha vai ficar bem. O assunto é essa linha. Por favor, ajude a consertar o problema.

EDIT: se replace este bloco:

 try { Pointer p = new Memory(73); } catch (Exception e) { e.printStackTrace(); } 

para

 try { Pointer p = new Memory(73); } catch (Throwable e) { System.out.println(e.getCause()); } 

Eu tenho java.security.AccessControlException: access negado (java.util.PropertyPermission jna.boot.library.path ler)

Ok, agora chegamos à raiz do problema. (Você ainda poderia ter usado o printStackTrace – isso também deveria ter impresso o rastreio da pilha da cause ).

  1. Applets não assinados têm access apenas a um número limitado de propriedades do sistema – as propriedades do jna não fazem parte delas.

  2. Em um applet não assinado, você não pode carregar bibliotecas nativas de qualquer maneira, então não há maneira de usar JNA (ou JNI, por sinal).

  3. Se você assina o applet (e diz ao plugin para aceitar a assinatura), seu applet tem os direitos necessários para usar o JNA. Mas os direitos de qualquer código único em execução são efetivamente a interseção dos direitos de todos os methods que chamaram o código atual.

    Os methods de applet chamados do JavaScript têm permissions extremamente limitadas (já que o Plugin não pode realmente verificar se o código JavaScript tem as permissions necessárias, se o seu navegador tiver esse conceito).

    Você pode contornar isso envolvendo a parte do código, que precisa ser executada com as permissions do seu applet, com AccessController.doPrivileged(...) . Mas primeiro certifique-se de que isso não possa fazer nada perigoso (o que é fácil com o JNI / JNA), mesmo quando chamado de código JavaScript malicioso.