Problemas com o JNI: undefined symbol: fp_init [RESOLVIDO]  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
oddy.silva
JavaEvangelist
[Avatar]

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.
[Email]
louds
Moderador
[Avatar]

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
[ICQ]
oddy.silva
JavaEvangelist
[Avatar]

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.
[Email]
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,

[WWW]
oddy.silva
JavaEvangelist
[Avatar]

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.
[Email]
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

[WWW]
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.
[WWW]
oddy.silva
JavaEvangelist
[Avatar]

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.
[Email]
oddy.silva
JavaEvangelist
[Avatar]

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.
[Email]
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.
[WWW]
oddy.silva
JavaEvangelist
[Avatar]

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.
[Email]
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.
[WWW]
oddy.silva
JavaEvangelist
[Avatar]

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.
[Email]
oddy.silva
JavaEvangelist
[Avatar]

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.
[Email]
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

[WWW]
 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team