Ir para conteúdo
  • Cadastre-se

dev botao

Pegar Dll Automáticamente 32 Ou 64


edsonmoretti
  • Este tópico foi criado há 3312 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Nós temos clientes com computador 32 e 64 bits, e para não ficar configurável ou toda vez construir, fiz essa alteração para pegar a dll 32 ou 64 de forma automática:

 

Na interface InteropLib

 

Mudei a linha:

public static final String JNA_LIBRARY_NAME = "ACBrFramework32";

para:

public static final String JNA_LIBRARY_NAME = PegarDLLpelaArqSO.DLL;

e dentro da class adicionei o seguinte método estático:

public static String pegaArq() {
   OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
   return operatingSystemMXBean.getArch().equals("x64")?"ACBrFramework64":"ACBrFramework32";
}
Link para o comentário
Compartilhar em outros sites

Olá edsonmoretti,

Primeiramente gostaríamos de agradecer a contribuição, realmente é um fator que complica bastante as configurações de ambiente.

Alteramos apenas um detalhe para detecção da JVM, quando o bean ManagementFactory.getOperatingSystemMXBean().getArch() é acionado, há várias combinações possíveis de retorno dependendo do SO em questão, internamente é acionado System.getProperty("os.arch").

Segundo a Oracle o modelo correto para fazer esta distinção é obtendo a propriedade, System.getProperty("sun.arch.data.model"), conforme pode ser visto no link: http://www.oracle.com/technetwork/java/hotspotfaq-138619.html, questão "When writing Java code, how do I distinguish between 32 and 64-bit operation?".

Devido a isto o código ficou da seguinte forma:

class PegarDLLpelaArqSO {
	private static String library = "";
	public static String pegarArq() {
		if (library.isEmpty()) {                
			library = System.getProperty("sun.arch.data.model").equals("64") 
					? "ACBrFramework64" : "ACBrFramework32";
		}
		return library;
	}
}

A modificação está presente no SVN. Qualquer melhoria que fizer ou achar necessária nos informe para aumentarmos a solidez da biblioteca em java.

 

Att.,

 

José Mauro

Link para o comentário
Compartilhar em outros sites

Obrigado, fico feliz em ter contribuído,  em meu caso eu deixei assim:

            return System.getProperty("sun.arch.data.model").equals("64") ? "ACBrFramework64" : "ACBrFramework32";

Pois o método é chamado apenas uma vez, no meu caso.
 

Também gostei pois reduziu os imports, espero mais a frente contribuir mais.

 

Um abraço.

Link para o comentário
Compartilhar em outros sites

Sem problema edsonmoretti pode deixar da forma que for coerente em seu contexto. Foi colocado desta forma porque um contexto estático é inicializado a nível somente uma vez dentro da JVM e economiza recursos caso haja mais de um acionamento.

 

Só tome cuidado quando for fazer algum merge com as possíveis melhorias, correções que podem vir na biblioteca para não perder a suas personalizações.

 

Abraço.

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...

Tive problemas com Windows 8 x64

Não reconhecia dessa forma:

                    ? "ACBrFramework64" : "ACBrFramework32";

 

Erro:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Unable to load library 'bin/ACBrFramsework64': Native library (win32-x86-64/bin/ACBrFramsework64) not found in resource path...

O mesmo ocorria quando colocava o .dll

 

dai alterei o retorno, usando file:

de:

return System.getProperty("sun.arch.data.model").equals("64") ? "bin/ACBrFramework64.dll" : "bin/ACBrFramework32.dll";

para:

return new File(System.getProperty("sun.arch.data.model").equals("64") ? "bin/ACBrFramework64.dll" : "bin/ACBrFramework32.dll").getAbsolutePath();

E com isso resolveu meu problema, não sei se foi um POG, mas resolveu.

Isso só aconteceu no Win8, no 7 e no XP estava normal.

 

Caso alguém tenha o mesmo problema.

Editado por edsonmoretti
Link para o comentário
Compartilhar em outros sites

  • 6 meses depois ...

No meu como utilizo linux estou com o seguinte erro.

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'ACBrFramework64': libACBrFramework64.so: cannot open shared object file: Arquivo ou diretório não encontrado
	at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:194)	at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:194)
	at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:194)
	aJava Result: 1

Como faço nessa situação ?

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
String apoio = Caixa.aCBrECF.dadosUltimaReducaoZ();

DadosReducaoZClass drz = Caixa.aCBrECF.getDadosReducaoZClass();
if (drz != null) {
   R02.setCOOInicial(Integer.valueOf(drz.getNumeroCOOInicial()));
}

Bom dia!

 

edsonmoretti, a dll ACBrFramework64 não terá mais suporte?

 

 

Aproveitando, estou tentando recuperar o COO_INICIAL da ultima redução z mas não traz resultado. Sempre vem uma string vazia "".

Alguém esta conseguindo recuperar esta informação?

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois ...

String apoio = Caixa.aCBrECF.dadosUltimaReducaoZ();

DadosReducaoZClass drz = Caixa.aCBrECF.getDadosReducaoZClass();
if (drz != null) {
   R02.setCOOInicial(Integer.valueOf(drz.getNumeroCOOInicial()));
}

Bom dia!

 

edsonmoretti, a dll ACBrFramework64 não terá mais suporte?

 

 

Aproveitando, estou tentando recuperar o COO_INICIAL da ultima redução z mas não traz resultado. Sempre vem uma string vazia "".

Alguém esta conseguindo recuperar esta informação?

 

Isso mesmo.

Vc ta chamando o metodo dessa forma:

instanciando..

ativando....

ecf.dadosUltimaReducaoZ();

String coo = ecf.getDadosReducaoZClass().getCoo();

 

vlw; -)

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3312 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.