JNI e DLLs 2: o pesadelo continua

:scrambleup: Eu sei, eu sei… Já postei isso uma vez (http://www.guj.com.br/forum/viewtopic.php?t=14084)… Mas a dúvida persiste… Meu caro colega de GUJ, Dharis, me deu umas dicas que funcionaram a princípio, mas que estão me pegando pelo pé agora…

[quote=“Dharis”]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]

Realmente… java -Djava.library.path=lib MainClass funciona e perfeitamente… Para todas as DLLs de todas as APIs que usam JNI que peguei até hoje…
System.load(caminho_completo_para_dll); funcionou em algumas dessas APIs e em outras não… Mas o lance é que eu preciso muito que essas DLLs sejam carregadas em runtime… Vou explicar: eu estou usando o InstallAnywhere aqui na empresa e estou usando o LaunchAnywhere… Pra quem não sabe, respectivamente, esses são programas de instalação (incluindo a Java VM) e de iniciar a aplicação Java via exe, sh ou o que o sistema do cliente precisar… O lance é que tem que ser assim, tem que ser com ClassLauncher exe e com instalador que faz um bundle da aplicação com a VM, porque os usuários são toscos demais pra saber o que é PATH, CLASSPATH ou ter uma idéia de como baixar uma VM e rodar uma MainClass… O problema disso é que o InstallAnywhere não me deixa passar “-Djava.library.path=lib MainClass” como argumento para a máquina virtual na hora de gerar o LaunchAnywhere. Logo, das duas uma:

:arrow: Ou eu aprendo a dar load nas DLLs de forma dinâmica, runtime mesmo;
:arrow: Ou então eu aprendo (do nada, uma vez que não achei no Help) como passar argumentos para a máquina virtual pelo InstallAnywhere

Apesar de eu ter violado toda a ideologia Java em detrimento da ideologia do meu chefe e da idiotologia dos usuários de software em geral, alguém pode me ajudar com um desses tópicos… Quem sabe, talvez, me indicar outra solução que eu não esteja vendo agora… Por favor? :oops:

Você pode usar a chamada:

System.loadLibrary("ICE_JNIRegistry");

Que carrega ICE_JNIRegistry.dll

Basta colocar essa biblioteca (e outras) em algum diretório que a variável PATH do sistema indique (ou acrescentar uma entrada pra o diretório de instalação delas).

[quote=“Dharis”]Você pode usar a chamada:

System.loadLibrary("ICE_JNIRegistry");

Que carrega ICE_JNIRegistry.dll

Basta colocar essa biblioteca (e outras) em algum diretório que a variável PATH do sistema indique (ou acrescentar uma entrada pra o diretório de instalação delas).[/quote]

:scrambleup: Olha, Dharis, eu tentei isso só que sem mexer com variável de ambiente, só usando o caminho completo para a DLL mesmo e não funcionou… Só serve com variável de ambiente mesmo ou do jeito que eu fiz deveria ter dado certo?

Eu sei que indicando na variável de ambiente PATH funciona (testei apenas no windows). Pois java.library.path aproveita a variável PATH do ambiente.

Então, se você incluir no PATH o caminho completo para o diretório de suas bibliotecas vai dar certo.
Outra idéia, se a estrutura de diretório for sempre a mesma e não desejares colocar o caminho completo no PATH, inclua o caminho relativo “.\lib” (sem aspas). Mas considere usar o caminho completo, ou colocar em um diretório do sistema como o SYSTEM32 ou algo assim.

Alguém pode ter algum idéia melhor :roll:

:scrambleup: Valeu… Vou ver aqui…