Java, JNI, Dlls, pesadelos

:scrambleup: De novo eu e JNI… Acontece que eu estou usando JNI, sabe? Vejam isso:

  public static boolean prepararIceJniRegistryDll(){
        try{
            Properties sysProperties = System.getProperties();
            File iceJniRegistryDll = new File(DLL_PATH + "/ICE_JNIRegistry.dll");
            
            if(!iceJniRegistryDll.canRead()){
                throw new FileNotFoundException("ICE_JNIRegistry.dll nao encontrada.");
            }
            
            String iceJniRegistryDllPath = iceJniRegistryDll.getAbsolutePath();
            System.out.println(iceJniRegistryDllPath);
            sysProperties.setProperty("java.library.path", iceJniRegistryDllPath);
        }
        catch(FileNotFoundException fileNotFoundException){
            return false;
        }
        catch(Exception exception){
            System.err.println("Outra excecao lancada em prepararIceJniRegistryDll");
            return false;
        }
        return true;
    }

Isso é o meu código para preparar o uso dessa dll que eu preciso pro JNI. Vale dizer que DLL_PATH é o caminho relativo para a pasta onde estão minhas dlls. Assim ó: tem uma pasta raiz e nela tem meus pacotes (br.inf.lalalalalala.blablabla) e tem um diretório lib onde está a DLL. O negócio é que esse código aí, no System.out.println() que ele tem, imprime:

:arrow: C:dir_RaizlibICE_JNIRegistry.dll

Mas, logo na linha abaixo, quando ele coloca a ICE_JNIRegistry.dll nas propriedades do sistema, ele lê o arquivo (ou parece fazer isso) como se fosse:

:arrow: C:dir_RaizICE_JNIRegistry.dll

Sei disso porque o código só funciona (cadastra a dll nas propriedades do sistema e deixa meu resto de programa que depende dela rodar) se a ICE_JNIRegistry.dll estiver na raiz e na pasta lib… Que tosco! Por que isso acontece? O que faço pra fazer funcionar direito??

:scrambleup: Correção:

No post acima: onde tem :arrow: deveria ter saído:

:arrow: C:\dir_Raiz\lib\ICE_JNIRegistry.dll

e

:arrow: C:\dir_Raiz\ICE_JNIRegistry.dll

Não sabia que tinha que pôr barraBarra (que nem Java)

:arrow: \

Foi mal…

Não sei se é um bug, mas modificar o java.library.path em runtime não adianta nada!!! Voce tem que passar o parametro na hora executar o java.

Já tive problemas semelhantes, é um S.A.C.O.

Ou seja:

java -cp . -Djava.library.path=XYZ com.louds.ClasseQueUsaJNI

public class ClasseQueUsaJNI {
  static {
     System.loadLibrary("xpto.so");
  }
}

Funciona legal.

java -cp . com.louds.ClasseQueUsaJNI2

public class ClasseQueUsaJNI2 {
  static {
     System.getProperties().setProperties("java.library.path", "XYZ");
     System.loadLibrary("xpto.so");
  }
}

Não funciona.

Ahh, boa sorte se tiver que trabalhar com linux também, ele tem suas pentelhações proprias como ignorar o /etc/ld.so.conf :?

Como você está fazendo o carregamento da biblioteca?

System.loadLibrary("nome_da_biblioteca");

ou

System.load("caminho_completo_arquivo_dll");

Parece que System.setProperties("java.library.path", "lib"); não funciona em runtime para System.loadLibrary("ICE_JNIRegistry");, pode estar faltando algo. Pois java -Djava.library.path=lib MainClass funciona!

Mas System.load(iceJniRegistryDll.getAbsolutePath()); parece uma alternativa para o seu caso.

[quote=“Dharis”]
Mas System.load(iceJniRegistryDll.getAbsolutePath()); parece uma alternativa para o seu caso.[/quote]

:scrambleup: Isso funcionou! Beleza! Muito obrigado, señor Dharis!