JNI + DLL + Tomcat

19 respostas
Lelis_el_Quatilas

Olá Pessoal!

Escrevi uma DLL em C++ e fiz um programa para ler essa DLL em Java, utilizando JNI. Apenas uma classe HelloWorld que chama a função da DLL. Funcionou perfeitamente. Mas quando tentei fazer o mesmo em uma aplicação WEB deu problema. Na hora de instanciar a classe que tem o método nativo aparece o seguinte erro:

E já coloquei a DLL na pasta Lib…
Tenho que configurar alguma coisa no Tomcat? Alguem poderia dar uma ajuda?

Valeu!

19 Respostas

Lelis_el_Quatilas

Mais algumas informações:

Estou usando o NetBeans. Quando testei a minha classe HelloWorld que funcionou eu rodei o programa via prompt. Agora quando tentei rodá-lo no NetBeans não funcionou também. Apareceu o seguinte mensagem:

Valeu pessoal!

smota

JNI usa como a mensagem de erro diz o parametro java.library.path que basicamente lista pro Java os diretorios onde as bibliotecas nativas estao e com certeza o lib do tomcat nao é um deles :wink:

Coloque sua biblioteca no system32 (se nao me engano no windows ele está listado) ou ao chamar o tomcat adicione na linha de comando do java.exe o parametro -Djava.library.path=caminho/pra/dll

Lelis_el_Quatilas

Muito bom smota! Valeuuu!

Agora já está encontrando a DLL, mas está ocorrendo outro erro:

O engraçado é que até chega a aparecer a janelinha avisando que a DLL foi compilada na versão introdutória do Visual C++, mas logo em seguida aparece esses erros. Estou quebrando a cabeça aqui, tem alguma idéia do que possa ser?

Obrigado pela atenção,

Lelis_el_Quatilas

hehehe, mais uma informação.

Eu estava tentando colocar a chamada do método nativo no servlet, só pra ver se mudava alguma coisa. Mas ao rodar o javah -jni no meu Servlet aparece uma mensagem de erro dizendo que não encontrou o javax.servlet.http.HttpServlet

O que pode ser isso?

Valeu galera!

Lelis_el_Quatilas

Está encontrando a DLL, mas não está encontrando o método, que se chama fnSimplexDLL()

E isso só acontece quando estou rodando Web, quando faço uma classe simples para rodar no terminal está funcionando… Alguma idéia?

Valeu pessoal!

louds

Usa o javah direito, passando o classpath pro jar com a API de servlets.

acho que vc esqueceu de mudar a assinatura do teu método nativo

Lelis_el_Quatilas

Bom, enquanto vou evoluindo vou contando aqui no fórum. Vi em outros fóruns dúvidas iguais as minhas, mas sem resposta. Então vou deixar de alguma forma registrado aqui, isso é, se der certo.

Não estava encontrando a função porque eu tinha que ter aplicado o javah -jni fora do pacote. No caso ficou assim:

Aí sim foi gerado o .h correto. E na hora de carregar a dll, estou utilizando:

Com isso pude deletar a dll do system32. Agora está chamando o método, mas nada acontece, fica eternamente carregando. Vou partir pra esse problema. Sei que virão outros, como carregar mais de uma vez a dll. Conto com a ajuda de vocês! hehehehe :smiley:

Valeu!

Lelis_el_Quatilas

Só agora li, louds! Valeu pela ajuda. Acho que isso realmente resolveria o problema de gerar o .h para o servlet. Estou começando a entender as coisas. :-o

Obrigado cara!

louds

Outra coisa JNI com servlets/j2ee não combina, se prepara que vai ser 1 viagem beeem frustrante…

smota

Hummm porque?

Eu não fiz o JNI, mas uso uma API bem grandinha em uma aplicação que é toda baseada em JNI.

Coloquei no system32 as dlls e a ressalva fica pros jars que tive que colocar no shared/lib do Tomcat pq senão eu tinha problemas se mais de um contexto usasse a API.

Lelis_el_Quatilas

Puuutz, isso até me desanima um pouco. Na pior das hipóteses vou ter que reescrever todo o meu código em C++ para Java… Isso vai ser realmente frustante. Smota, no meu caso, também vou ter problemas caso o contexto carregue a DLL mais de uma vez, não vou? Não entendi a parte de colocar no shared/lib do Tomcat. Eu uso o tomcat que vem no NetBeans 3.5.1, tem algum mal nisso? Agora estou com problemas em ler um arquivo através da DLL, não sei onde coloco, hehehe. Vou lá quebrar a cabeça, quando tiver novidades volto a escrever.

Valeu pelo apoio pessoal!

inté,

Lelis_el_Quatilas

Bem, estou apenas testando uma aplicaçãozinha só com uma classe com função main que lê a dll. Quando eu rodo ela através do NetBeans a DLL não encontra o arquivo que precisa ser lido (fica tudo dentro de uma mesma pasta) mas quando vou através do prompt de comando o programa é executado corretamente. Como eu faço pra minha DLL enxergar o arquivo através do NetBeans, alguém? Alguma idéia?

inté,
Levi

Lelis_el_Quatilas

Na verdade tanto através do NetBeans quanto através da linha de comando a DLL acha o arquivo, mas através do NetBeans ela não consegue ler o arquivo… Muito estranho isso. Talvez seja por causa disso que a aplicação web (que também testo através do NetBeans) também não esteja funcionando. Se alguém tiver alguma luz, vai ser muito bem vinda.

Valeu!

Lelis_el_Quatilas

Vacilei… Quando rodado no NetBeans o arquivo é procurado na pasta do NetBeans… (???). Agora tá dando certo. Vamos a aplicação web…

flw!

Lelis_el_Quatilas

AAAAAAAAHHHHHHHHHHHHH!!!
Deu certo!!! :smiley: :smiley: :smiley: :smiley:

Agora, smota, como faço para a DLL poder ser carregada mais de uma vez?!?!?!?!

:smiley:

inté!

smota

Entao … tem que colocar lá no shared/lib que é um subdiretório do tomcat (e remover do WEB-INF/lib da sua aplicação).

Mas isso só é preciso se mais de um contexto for utilizar a biblioteca … estando no shared o Tomcat garante que vai carregar apenas uma vez em memoria.

smota

Ah … parabens! :thumbup:

Lelis_el_Quatilas

ahhhh, acho que entendi. Se tiver algum problema eu volto a perguntar! hehehehehe :lol:

Smota, muito obrigado cara!!! Valeu mesmo!!!

Abração e até!

Lelis_el_Quatilas

Smota, tem como me explicar quando o contexto vai ser carregado mais de uma vez? Em termos práticos… O meu sistema está rodando na web. Usuários acessando, quando isso ocorre?

Valeu!

Criado 9 de março de 2005
Ultima resposta 11 de mar. de 2005
Respostas 19
Participantes 3