Opa!!
Estou usando, em uma Applet, a API de um terceiro para fazer interação com um leitor biométrico. Quando instancio o objeto principal dessa API, é carregado no classloader a API.dll. Quando é feito o reload da página onde a Applet se encontra é lançado o seguinte erro no momento de instanciar o objeto principal:
java.lang.UnsatisfiedLinkError: Native Library C:\Windows\System32\API.dll already loaded in another classloader
O que possivelmente a API está fazendo é um ‘ClassLoader.loadClass(“API.dll”).newInstance()’ e no reload da página ele tenta carregar novamente a DLL. Pelo que pesquisei, não é possível excluir essa referência da DLL no classloader. Consegui pegar uma instância desse objeto já carregado no classloader, da seguinte maneira:
ClassLoader loader = MinhaApplet.class.getClassLoader();
Class<?> classe = loader.loadClass("com.simple.API");
Porém, não consigo fazer invoke dos métodos do objeto "classe", que é um Class. Consigo ver os métodos declarados, porém não consigo fazer o invoke.
Imagino então que uma solução seria acabar com a referência à API.dll no classloader ou fazer uma espécie de Singleton com o objeto principal da API, ou seja, instanciar apenas uma vez esse objeto e as Applets fazerem uso dele (não sei nem se isso é possível!). E pra adiantar, a Applet não terá comunicação com Tomcat, JBoss ou qualquer outro server java.
Se alguém puder sugerir alguma coisa, será de grande ajuda!
Um abraço!!