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:
#include <stdio.h>
#include <stdlib.h>
#include <libfprint/fprint.h>
#include <string.h>
#include <jni.h>
#include "Leitor.h"
struct fp_dev* fpdev = NULL;
struct fp_dscv_dev **discovered_devs = NULL;
struct fp_print_data **printdata = NULL;
JNIEXPORT jint JNICALL
Java_Leitor_principal(JNIEnv *env, jobject obj) {
//Variável usada por todos os resultados.
int r;
/* Inicia o libFprint() */
r = fp_init();
if (r < 0)
return r;
//********** um monte de código *******
//Encerra minha aplicacao
fp_dev_close(fpdev);
Criei minha classe Java:
public class Leitor {
private native int principal();
public static void main(String[] args) {
new Leitor().principal();
}
static {
System.loadLibrary("Leitor");
}
}
Depois trilheii minuciosamente os passos abaixo para compilação:
javac Leitor.java
javah -jni Leitor
gcc -Wall -fPIC -c Leitor.c -I/opt/jdk1.6.0_11/include/linux/ -I/opt/jdk1.6.0_11/include/ -I/usr/include/libfprint/ -lfprint
gcc -shared -Wl,-soname,libLeitor.so -o libLeitor.so Leitor.o
LD_LIBRARY_PATH=.
export LD_LIBRARY_PATH
java Leitor
Mas retorna a seguinte mensagem de erro:
undefined symbol: fp_init
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.