JNI e DLLs 2: o pesadelo continua

4 respostas
martui

: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…

“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.

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:

4 Respostas

D

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).

martui

“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).

: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?

D

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:

martui

:scrambleup: Valeu… Vou ver aqui…

Criado 23 de julho de 2004
Ultima resposta 27 de jul. de 2004
Respostas 4
Participantes 2