| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/06/2009 08:33:55
|
oddy.silva
JavaEvangelist
![[Avatar]](/images/avatar/3647532ec07150bfa31ec2896932bdfb.jpg)
Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline
|
Boa tarde ao pessoal do Guj. Eu estou trabalhando em cima de uma aplicação que usa JNI para acessar métodos nativos em C.
O código escrito em C trabalha em cima de uma biblioteca, a libfprint.
Pois bem, eu escrevi meu código C:
Criei minha classe Java:
Depois trilheii minuciosamente os passos abaixo para compilação:
Mas retorna a seguinte mensagem de erro:
Eu pude notar que o JNI não reconhece as funções da biblioteca libfprint, somente as bibliotecas padrões.
Eu fiz um teste: apaguei todos as funções do libfprint e deixei somente as funções padrões do C, tais como
printf, scanf, fflush, etc. Daí eu coloquei pra rodar com JNI e deu certo.
Daí fiz outro teste: rodei a aplicação em C puro, sem o JNI, mas com as funções do libfprint, ou seja, meu
programa completo. Mais uma vez funcionou.
Alguém pode me ajudar? Desde já agradeço a todos.
This message was edited 1 time. Last update was at 16/06/2009 08:44:19
|
Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"
Quer ser um programador veloz? Então compre um par de tênis a jato.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/06/2009 14:46:14
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
O DL não está encontrando a libfprint, seja via o caminho padrão ou via LD_LIBRARY_PATH.
This message was edited 1 time. Last update was at 09/06/2009 14:46:28
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/06/2009 22:02:55
|
oddy.silva
JavaEvangelist
![[Avatar]](/images/avatar/3647532ec07150bfa31ec2896932bdfb.jpg)
Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline
|
Loud, você sabe como eu posso resolver isso?
Porque quando eu configuro o PATH, eu apenas informo que a minha biblioteca nativa está no diretório atual.
Mas o libfprint está em outra. Tem como eu setar o PATH para dois lugares diferentes, ao mesmo tempo?
Se sim, como? Abraço.
|
Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"
Quer ser um programador veloz? Então compre um par de tênis a jato.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 05:34:04
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
In Linux, the environment variable LD_LIBRARY_PATH is a colon-separated set of directories where libraries should be searched for first, before the standard set of directories;
Ou seja,
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 09:25:02
|
oddy.silva
JavaEvangelist
![[Avatar]](/images/avatar/3647532ec07150bfa31ec2896932bdfb.jpg)
Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline
|
Ainda não deu certo.
Tentei na ordem que aparece abaixo:
Mas retorna o mesmo erro:
Alguém tem mais alguma idéia do que pode ser? Enquanto isso eu vou continuar travando minha batalha aqui.
|
Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"
Quer ser um programador veloz? Então compre um par de tênis a jato.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 09:27:23
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
/usr/include/libfprint contém o arquivo .so que deve ser carregado? Esse arquivo .so tem a devida permissão de execução?
E a propósito, não termine os nomes de diretórios no LD_LIBRARY_PATH (exceto o diretório raiz) por "/"; não sei se o Linux se confunde com tais nomes de diretórios.
This message was edited 1 time. Last update was at 10/06/2009 09:27:39
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 09:30:35
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Continue a ler o arquivo http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html que lhe passei, e procure o item LD_DEBUG. Acho que o que ele recomenda fazer vai lhe ajudar bastante porque você vai ver o que o Linux está tentando fazer para achar o fp_init.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 12:31:46
|
oddy.silva
JavaEvangelist
![[Avatar]](/images/avatar/3647532ec07150bfa31ec2896932bdfb.jpg)
Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline
|
Até agora nada...
Agora está mais por tentaiva e erro mesmo.
Caso alguém tenha alguma idéia, pode dizer.
|
Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"
Quer ser um programador veloz? Então compre um par de tênis a jato.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 14:04:11
|
oddy.silva
JavaEvangelist
![[Avatar]](/images/avatar/3647532ec07150bfa31ec2896932bdfb.jpg)
Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline
|
Bom, larguei a mão do JNI e parti pro JNA. Li alguma coisa sobre lá no blog do Urubatan e depois no java.net e achei mais simples.
Minha única dúvida é: como gerar o arquivo .h? Por acaso eu posso usar o javah -jni para fazer isso e depois continuar a usar
o jna ou tenho que criar essa biblioteca na mão?
Abaixo estão minhas duas classes:
O meu objetivo continua sendo o mesmo, que é rodar o método "principal" do
meu arquivo em C. LeitorBiometico deve ser o meu arquivo.h
This message was edited 1 time. Last update was at 10/06/2009 14:04:46
|
Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"
Quer ser um programador veloz? Então compre um par de tênis a jato.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 14:19:00
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
No caso do JNA você se baseia no arquivo .h do cara que escreveu a DLL ou .SO original. Há no site do JNA uma tabela de correspondências (do tipo long do C é int do Java, mas long long do C é long do Java). Você não precisa de nada do seu código JNI original.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 14:39:12
|
oddy.silva
JavaEvangelist
![[Avatar]](/images/avatar/3647532ec07150bfa31ec2896932bdfb.jpg)
Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline
|
Thingol, isso significa que seu eu escrever um arquivo em C, eu devo gerar o .h dele?
|
Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"
Quer ser um programador veloz? Então compre um par de tênis a jato.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 15:13:24
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Boa pergunta. Você tem um determinado .so que tem um método
Isso provavelmente está especificado em um arquivo .h, ou então está na sua documentação.
O JNA não requer a presença física de um arquivo .h ou .c ou sei lá o quê, mas exige que você saiba exatamente o que está fazendo, e que você tenha lido direito a sua documentação.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 15:48:42
|
oddy.silva
JavaEvangelist
![[Avatar]](/images/avatar/3647532ec07150bfa31ec2896932bdfb.jpg)
Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline
|
Saquei. Mas daí então eu não vou precisar gerar esse .so, pois "fp_init()" está dentro da função "principal()", e o arquivo que contém os dois já informa o caminho do fprint nos includes. Quando eu for gerar um arquivo com a extensão .o, com o gcc, basta eu informar o caminho do arquivo que contém fp_init().
Até agora eu fiz o seguinte. Tenho meus arquivos em C, inclusive os .so, gerados e gravados em um diretório. Daí eu criei as minhas duas classes em JNA, como citado anteriormente. Daí quando eu vou rodar a aplicação pelo NetBeans aparece a seguinte mensagem:
"No JNI eu resolvia isso setando o PATH", pensei. Então abri o terminal do linux, fui até NetBeansProjects/LeitorBiometrico/src e digitei:
Mas o danado do erro persistiu.
Daí pensei assim: "bom, talvez tenha que copiar todos fontes (incluindo .o, .so e compania) da pasta do LeitorBiometrico para pasta src do meu projeto JAVA". Fiz isso novamente, mas não obtive êxito (pela enésima vez).
Alguém tem alguma idéia do que pode estar ocorrendo?
This message was edited 1 time. Last update was at 10/06/2009 15:49:12
|
Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"
Quer ser um programador veloz? Então compre um par de tênis a jato.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 16:05:35
|
oddy.silva
JavaEvangelist
![[Avatar]](/images/avatar/3647532ec07150bfa31ec2896932bdfb.jpg)
Membro desde: 24/11/2008 11:42:10
Mensagens: 352
Localização: Itu
Offline
|
Dando uma olhada na documentação encontrei o método "addSearchPath", que resolveu o problema de busca no diretório.
Veja o código abaixo:
Mas daí, quando vou rodá-lo no NetBeans, sabe qual o erro que aperece?
Pois é, esse cidadão voltou. Vou ver o que posso fazer e trago a solução mais tarde.
|
Odair
Gestão em T.I
FATEC - ITU
"Quem quer fazer alguma coisa, encontra um meio"
Quer ser um programador veloz? Então compre um par de tênis a jato.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/06/2009 16:11:15
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Aham - será que o símbolo exportado é "fp_init" ou "_fp_init"? Dê uma olhada na lista de símbolos exportados por esse .so. Dica
man nm
|
|
|
 |
|
|