Jni help

14 respostas
C

Pessoal tenho uma biblioteca feita em C, gostaria de compilar ela no linux e no meu programa java usar as funções estão nessa biblioteca.

alguém pode me ajudar ?

14 Respostas

C

galera pra ser mais especifico, estou desenvolvendo um sistema q preciso emitir cupom fiscal na impressora bematech MP 2100 TH, baixei a no site da bematech a lib300fi.c, eu gostaria de compilar esse arquivo e no java usar a funções.

minha maior dificuldade esta sendo em compilar esse arquivo. Alguém pode me ajudar ?

está dando esse erro :

incompatible implicit declaration of built-in function ‘memset’

T

Isso deve ser algum include que está conflitando com outro include. Veja se algum arquivo .h ou .hpp está redefinindo memset, que é uma rotina intrínseca do compilador e não deve ser redefinida.

C

puxa cara sou bastante leigo C, pra falar a verdade essa é a primeira vez que tento compilar alguma coisa.

vou anexar o arquivo vc da uma forcinha aí ?

Valeu!

C

declarei mais dois header

#include <strings.h>
#include <string.h>

agora só está dando esse erro, antes dava esse mais um monte.

/usr/lib/gcc/i486-linux-gnu/4.2.3/…/…/…/…/lib/crt1.o: In function _start': (.text+0x18): undefined reference tomain’
collect2: ld returned 1 exit status

Help Please !?!?!

S

entao cara se a sua impressora for fiscal MP2100 TH FI, tem o jar no site da bematech

mas se for a nao fiscal MP2100 TH ai vc vai ter que usar o jni msm, aqui a gente fez um esquema que chama um programa externo por falta de tempo… provavelmente eu vou tentar fazer algo com o jni dps…

T

Qual é o jeito que você está compilando esse arquivo?

Se você só usar a opção -o, (e não usar a opção -c) então ele vai tentar criar um arquivo executável e procurar o método main, que obviamente não existe nesse seu arquivo.

Para usar com JNI, é preciso usar algumas opções malucas, porque é necessário criar um “shared object”. Não sei quais são essas opções no Linux.

C

a impressora é MP2100TH não fiscal, e o jar que tem no site da bematech eu conseguir usá-lo… ele já usa JNI tanto que é amarrado com a BemaFi32.dll. Eu Acredito que conseguindo compilar esse Lib300Fi esse jar tb funcione.

se alguém puder me ajudar a compilar esse lib300fi.c …

agradeço muito msm !!!

C

estou tentando compilar assim :

gcc lib300fi.c

passando somente o nome do arquivo, não sei tb se essa seria a forma correta .

T

Você precisa passar mais uma montanha de opções porque você precisa juntar isso com seu código JNI.

Não sei quais são as opções certas, mas deveria ser algo como:

gcc -c -o -KPIC blablabla.o blablabla.c
gcc -c -o -KPIC blablablaJNI.o blablablaJNI.c
gcc -o blebleJNI.so blablabla.o blablablaJNI.o bibliotecasJNI.a

-c = compilar apenas, não linkar
-o = nome do arquivo de saída
-KPIC = não sei se essa é a opção correta, mas seria a opção para produzir “Position Independent Code” que é necessário para usar com arquivos .so (“Shared Object”).
blablabla.c = API da Bematech
blablablaJNI.c = encapsulamento JNI (que você tem de escrever!) da API blablabla.c
bibliotecasJNI.a = as bibliotecas do JNI que são necessárias para linkar junto com seu programa

Deve haver mais um monte de opções, já que nunca fiz algo com JNI no Linux, mas é questão de procurar.

C

pessoal conseguir compilar…

gcc -shared -o lib300fi.so lib300fi.c

agora eu tenho a biblioteca lib300fi.so, preciso agora mepear o métodos em java (JNI).

temos essa função na lib

Bematech_FI_AbreCupom(Char *CGC, &Retorno )

como ficaria o métoco em java (JNI) ?

C

declarei o método dessa forma :

public static native int AbreCupom(String CPF_CGC);

e carrego a biblioteca dessa forma :

System.load ("/home/clauber/foodmanager/BemaFILX/Lib300FI/lib300fi.so");

porém esta dando esse erro :

Exception in thread main java.lang.UnsatisfiedLinkError: bemajava.Bematech.AbreCupom(Ljava/lang/String;)I

at bemajava.Bematech.AbreCupom(Native Method)

at bemajava.Principal.main(Principal.java:29)
T

O problema do JNI é que você tem de começar de trás para frente. Ele simplesmente não aceita programas em C já prontos como você está tentando fazer.

a) Crie uma classe Java, só com as definições dos métodos (public static native …) e a compile, criando um arquivo .class

b) Use o javah (ferramenta do JDK) para criar um arquivo .h a partir dessa classe.

c) Uma vez que você tem o arquivo .h, você tem de implementar os métodos que estão declarados nele em um novo arquivo .c. Essa é a parte mais difícil e mais chata. Prepare-se para muito choro e ranger de dentes.

d) Uma vez compilado o arquivo .c, você precisa linká-lo juntamente com aquele arquivo .c da Bematech.

Você entendeu por que é que a Bematech não disponibiliza a versão JNI da tal biblioteca? Dá um trabalhão dos infernos o passo c).

C

então cara…

eu tenho esse arquivo Bematech.java com a declaração de todos os métodos native e carregando a lib,
no windows funciona perfeitamente, repare que está até comentado a linha onde eu carrego a BemaFi32.dll.

só que aqui no linux está dando esse erro :

Exception in thread main java.lang.UnsatisfiedLinkError: bemajava.Bematech.AbreCupom(Ljava/lang/String;)I

at bemajava.Bematech.AbreCupom(Native Method)

at bemajava.Principal.main(Principal.java:29)
T

Tem mais algum arquivo em C faltando nessa história.

Criado 18 de setembro de 2008
Ultima resposta 18 de set. de 2008
Respostas 14
Participantes 3