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?
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:
Sistema operacional e qual Java - qual Windows? Versão Java com nome completo?
O que estava rodando junto no momento do erro? PcAnywhere por acaso?
O que mostrou o DrWatson?
E os eventos do Windows NT?
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
igorps
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
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…ñ entendo o q pode estar errado…
I
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 ?:]
I
igorps
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
thingol
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 , 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.
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!!!