Estou utilizando JNA para ler a versão de um arquivo .EXE. No Windows funciona bem, consigo ler Versão do arquivo e Versão do Produto (Propriedades). Porém eu também precisava ler essas informações no Linux pois o cliente poderá verificar a versão do EXE através de um compartilhamento.
O problema é que no Linux, quando meu sistema tenta ler a versão do arquivo é gerado o erro “java.lang.UnsatisfiedLinkError: Unable to load library 'version’
Native library (linux-x86-64/libversion.so) no found in resource path….”
Já procurei informações sobre esse arquivo “libversion.so” mas não encontrei em lugar nenhum.
Alguém já enfrentou essa situação ou tem alguma solução a respeito? Se existir alguma outra forma de obter essas informações (tanto no Windows quanto no Linux) fico grato se alguém me informar.
Meu código abaixo:
public String pegaVersaoProdutoWindows(String arquivo, Integer digVs) throws Exception {
File fileToCheck = new File(arquivo);
short[] rtnData = new short[digVs];
int infoSize = Version.INSTANCE.GetFileVersionInfoSize(fileToCheck.getAbsolutePath(), null);
Pointer buffer = Kernel32.INSTANCE.LocalAlloc(WinBase.LMEM_ZEROINIT, infoSize);
try {
Version.INSTANCE.GetFileVersionInfo(fileToCheck.getAbsolutePath(), 0, infoSize, buffer);
IntByReference outputSize = new IntByReference();
PointerByReference pointer = new PointerByReference();
Version.INSTANCE.VerQueryValue(buffer, "\\", pointer, outputSize);
VerRsrc.VS_FIXEDFILEINFO fileInfoStructure = new VerRsrc.VS_FIXEDFILEINFO(pointer.getValue());
//Product version
for(int i = 0; i < digVs;i++) {
switch(i) {
case 0:
rtnData[0] = (short) (fileInfoStructure.dwProductVersionMS.longValue() >> 16);
break;
case 1:
rtnData[1] = (short) (fileInfoStructure.dwProductVersionMS.longValue() & 0xffff);
break;
case 2:
rtnData[2] = (short) (fileInfoStructure.dwProductVersionLS.longValue() >> 16);
break;
case 3:
rtnData[3] = (short) (fileInfoStructure.dwProductVersionLS.longValue() & 0xffff);
break;
}
}
//Pega o número da versão em String
String versao = dump(rtnData);
return versao;
} finally {
Kernel32.INSTANCE.GlobalFree(buffer);
}
}