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 ?
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 ?
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’
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.
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!
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 !?!?!
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…
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.
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 !!!
estou tentando compilar assim :
gcc lib300fi.c
passando somente o nome do arquivo, não sei tb se essa seria a forma correta .
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.
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) ?
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)
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).
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)
Tem mais algum arquivo em C faltando nessa história.