JNI - Urgente!

14 respostas
I

Fala pessoal,
tenho um método nativo implementado a partir de JNI, no entanto qd eu executo o programa java a seguinte mensagem eh exibida:

An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x3
Function=[Unknown.]
Library=(N/A)

NOTE: We are unable to locate the function name symbol for the error
just occurred. Please refer to release documentation for possible
reason and solutions.

Current Java thread:

at TesteDll.P1602_AddToScan(Native Method)

at Teste2.main(Teste2.java:114)

…Ele dá esse erro em um método bem parecido com os demais em que não houveram erros na hra da execução…o que pode estar errado?

14 Respostas

Luca

Olá

Pensando só em Java e em JNI lhe digo que não tenho a menor idéia.

Mas vou lhe fazer algumas perguntas que lhe ajudarão a cercar o problema:

  1. Sistema operacional e qual Java - qual Windows? Versão Java com nome completo?

  2. O que estava rodando junto no momento do erro? PcAnywhere por acaso?

  3. O que mostrou o DrWatson?

  4. E os eventos do Windows NT?

  5. Este erro ocorre sempre? E se você adotar o método Bill Gates de resolução de problemas e rebootar a máquina só com um mínimo de serviços essenciais carregados?

De posse de todas estas respostas, coloque aqui junto com mais informações e talvez alguém possa ajudá-lo.

[]s
Luca

I

bem…utilizo o windows 98 e to com o java j2sdk1.4.2_06… tenho outras funções similares… na parte em c os argumentos são do tipo WORD e DWORD…eu mapeei como short e int, respectivamente, no java.

Luca

Olá

Respondeu apenas (1).

Economizando nas informações sua dúvida urgente dificilmente será respondida.

[]s
Luca

Lelis_el_Quatilas

Vc já testou com outras funções se a passagem de parâmetro está funcionando? Se vc mapeou corretamente e já fez testes que funcionaram, então vc está com erro dentro do seu método nativo.

Esse erro pode aparecer quando vc acessa uma área inválida de memória (segmentation fault) no seu método nativo. Como sugestão, rode essa sua função em C em um programa terminal, esqueça a DLL por enquanto, teste ele bastante e quando tiver certeza que ele tá rodondinho passe para a DLL. Aí vai funcionar blz.

Testar direto pela DLL é humanamente impossível, as msgs de erro reportadas pela JVM não ajudam muito!!!

Boa sorte! Achar esses erros em C/C++, especialmente C é um saco! Passei o final de semana procurando um segmentation fault no meu compila. E passei mais raiva ainda pq é no super robusto (ironicamente falando, claro) Cygwin…

flw!

I

pois eh…eu jah testei outras funções…a passagem de parametros está correta…ainda agora criei uma aplicação tipo console com um metodo principal no dev c++ apenas para testar esta função bugada… eu rodei o programa e a resposta foi aquela tela dizendo: “vc executou uma operação ilegal…seu programa será fechado”… qd eu tirei esta função do programa ele rodou normalmente…ñ entendo o q pode estar errado…

I

pois eh…eu jah testei outras funções…a passagem de parametros está correta…ainda agora criei uma aplicação tipo console com um metodo principal no dev c++ apenas para testar esta função bugada… eu rodei o programa e a resposta foi aquela tela dizendo: “vc executou uma operação ilegal…seu programa será fechado”… qd eu tirei esta função do programa ele rodou normalmente…
alguma luz ?:]

I

só pra acrescentar…esta função se trata de uma dentre varias utilizadas para trabalhar com uma placa de aquisição de dados (A/D)…esta função especialmente, configura um canal para receber dados.

T

igorps:
pois eh…eu jah testei outras funções…a passagem de parametros está correta…ainda agora criei uma aplicação tipo console com um metodo principal no dev c++ apenas para testar esta função bugada… eu rodei o programa e a resposta foi aquela tela dizendo: “vc executou uma operação ilegal…seu programa será fechado”… qd eu tirei esta função do programa ele rodou normalmente…
alguma luz ?:]

Isso é legal :stuck_out_tongue: , quer dizer provavelmente que algum pré-requisito para essa função funcionar está faltando, e logo de cara já deu pau. Por exemplo, se ela requer um buffer pré-alocado para funcionar, você precisa alocá-lo, e da maneira que foi especificado pela documentação da placa - não é só aquietar a mensagem de erro do compilador; você precisa saber direitinho o que está fazendo.
Pela descrição do erro dada pelo Windows, parece que você passou algum parâmetro NULL para a função (ou então preencheu alguma estrutura de dados que deveria ter um ponteiro para uma posição de memória com o valor NULL), e dentro dela alguma rotina tentou acessar o endereço 3 da memória. Como ela não pode ser acessada, deu o tal GPF no seu programa.

EDIT - dá impressão que é um ponteiro de função que recebeu o valor 0, ou 3.

Faça a tal função funcionar em C primeiro, depois passe para Java. Use o método científico: use o ambiente mais simples possível © para fazer as coisas funcionarem. Se conseguir, então vá para o ambiente mais complicado (Java + JNI) para ver se funciona. Se funcionar, beleza, senão você vai ter de voltar e ver o que aconteceu de errado.

I

bem…esta função na verdade eh teorcamente bem simples…ela tem como argumentos um bando de tipo WORD (short) …eu fiz uma rotina em c que usa tal função…e deu certo…ou melhor deu um erro…mas n foi nessa função…mas mudando um pouco a ótica do assunto…será que não tem uma forma de acessar a dll da placa sem ter q usar jni? eu digo isso pq o que eu tenho na verdade eh uma dll q eu criei composta do arquivo .h ,gerado através do comando javah, e um .cpp que eu gerei. o problema eh que as implementações desse .cpp chamam o que realmente importa: as funções da minha dll principal…ker dizer eu fiz uma dll que chama as funções da dll principal…keria poder acessar diretamente a dll da placa sem ter q passar por essa dll criada através de JNI…isso com certeza aumentaria a performance do sistema…

Lelis_el_Quatilas

Boa pergunta!!!

Como faço para usar uma dll em Java sendo que a dll não foi construida utilizando JNI?

:?: :?: :?: :?:

Luca

Olá

Não.

JNI funciona direitinho. Você tem um erro e deve usar TODOS os mecanismos para descobri-lo. Eu citei alguns, outros deram dicas sobre como proceder. Parece só uma questão de persistência.

Caso não encontre o erro, uma outra tentativa que você poderia fazer seria compilar sua dll com o Visual Studio. Já vi problemas com dll compilada com o compilador da Borland e talvez seja seu caso com o devc++.

[]s
Luca

Lelis_el_Quatilas

Mas Luca, e uma DLL que já veio pronta, sem ter sido compilada com o JNI, como faço para usá-la em Java? Tenho necessariamente que construir uma outra DLL usando JNI que usa a primeira?

Deu pra entender?

A propósito, como foi de festividades no final de semana?! Teve bom? Parabéns mais uma vez para o senhor!!! :wink:

Luca

Olá

Sim!

Obrigado!

Está no céu!

[]s
Luca

Lelis_el_Quatilas

:oops:

hehehehehehe

Criado 23 de maio de 2005
Ultima resposta 23 de mai. de 2005
Respostas 14
Participantes 4