JNA com C++

20 respostas
D

Bom, achei um tutorial de JNA com C em um blog e funcionou corretamente. Crio um arquivo .so, uma interface em java e utilizo o metodo da biblioteca nativa sem problemas.
Porém, estou tentando agora utilizar os metodos do meu projeto em C++ e nao estou conseguindo. Quais sao as diferenças entre utilizar um metodo nativo em c e em c++ ?

Alguem tem algum exemplo utilizando metodos de uma classe em C++ em codigo java?

20 Respostas

E

Cara vc pode usar JNI para fazer isso. abaixo tem um exemplo de integração. Boa sorte!

http://gcc.gnu.org/java/papers/native++.html

T

Hum… espera um pouquinho.

Pra começar, o fato de você ter gerado um arquivo .so quer dizer que você está usando Linux e o g++ , não?

Não sei se você, ao gerar sua biblioteca em C, criou um arquivo .a.

Esse arquivo .a, além do arquivo .h, são necessários para seu programa em C++ acessar as rotinas desse .so.

De qualquer maneira, ao codificar o arquivo .h, é necessário incluir as seguintes linhas:

#ifdef __cplusplus
extern "C" {
#endif

... suas declarações C ...

#ifdef __cplusplus
}; 
#endif

Isso para que o programa C++ entenda que as rotinas que você quer chamar foram compiladas em C, não em C++.

D

estou usando linux sim, thingol. tenho um projeto todo em c++ e quero fazer uma interface pra ele em java. pra isso, preciso acessar os metodos nativos do meu projeto em c++.

minha duvida eh a seguinte: as alusoes dos meus metodos em C++ devem estar dentro do extern “C”? correto ? depois disso, devo criar uma interface em java com os metodos que irei chamar na interface ?

achei um tutorial em C e rodei o exemplo que ele tinha no blog, mas nao encontrei nada pra c++.

T

Não entendi muito bem o que você quer.

De qualquer maneira, para você acessar um método em C a partir de um programa C++, normalmente você faz isto aqui:

extern "C" {
    double sin (double d); // rotina que foi escrita em C e você quer usar em C++
    double cos (double d);
};

Esse tal “#ifdef __cplusplus” é só um truque para que você possa reaproveitar seu arquivo .h em um programa C puro.

D

o que quero eh acessar meus metodos c++ pelo java. dei uma olhada por cima e acho que o site que o ebarros postou tira minhas duvidas. de qualquer forma, agradeço.

se alguma duvida aparecer, voltarei para posta-la aqui.

ah, o tutorial eh sobre JNI. verei se consigo integrar meu projeto em c++ com a interface em java.

abs

T

A forma mais fácil de acessar métodos C++ pelo Java é expor uma interface C para eles, e usar JNA. Isso quer dizer que se você quiser criar um objeto C++ ou então usar métodos não-estáticos C++ fica um pouco complicado.

D

é o que eu quero fazer. Criar, na verdade, dois objetos de duas classes c++ diferentes, e passar por parametro o que o usuario colocar na interface grafica java.

é possível fazer o que quero utilizando JNA ?

T

Como é difícil expor um objeto C++ em uma interface C, você pode fazer uma de duas coisas:

a) C++ e Java conversam entre si via XML (você mapeia o objeto para XML), e você passa uma string XML de/para o C++.

b) Se o objeto for muito bobo (3/4 campos), você pode passar cada um dos campos como parâmetro.

D

ah, entao mapear pra xml deve ser mais facil. preciso colher ate agora 4 campos da interface grafica. 3 strings e um double. procurarei no forum como mapear pra xml entao. valeu

D

Estou vendo um exemplo aqui de mapeamento de Java pra XML usando xtream. Achei bastante fácil. Porém, pelo o que estou lendo no site do xtream, ele suporta apenas plataforma windows e a licença é paga. Alguem conhece outra forma de mapeamento?

T

Se você quer mapear 4 campos não vale a pena passar para XML; passe os campos como parâmetros mesmo.

De qualquer maneira, eu digo que é melhor usar um mapeamento “caseiro*” porque ele deve ter a ida e a volta - não adianta ter algo que só funciona em Java ou só funciona em C++.

  • Ou seja, você bola um XML bem simples que represente seu objeto - não há necessidade de usar SOAP ou outras coisas malucas.
A

Galera preciso da ajuda de vcs…

Tenho um código muito complexo em C++ (body tracking no Kinect) e preciso usar estas funções

no JAVA. Utilizei o JNA mas funciona apenas com C e naum com C++.

A minha pergunta é: JNA funciona com C++ ou apenas o JNI?

Eu naum queria utilizar o JNI pelo fato de dar muitos erros, API muito complicada…

Se algum puder me ajudar a fazer o C++ a funcionar no JAVA através do JNA, ou seja, queria que o Java

acessasse as funções do C++, agradeceria muito…

Vlw pela atenção

J

AnthonyLaMarca:
Galera preciso da ajuda de vcs…

Tenho um código muito complexo em C++ (body tracking no Kinect) e preciso usar estas funções

no JAVA. Utilizei o JNA mas funciona apenas com C e naum com C++.

A minha pergunta é: JNA funciona com C++ ou apenas o JNI?

Eu naum queria utilizar o JNI pelo fato de dar muitos erros, API muito complicada…

Se algum puder me ajudar a fazer o C++ a funcionar no JAVA através do JNA, ou seja, queria que o Java

acessasse as funções do C++, agradeceria muito…

Vlw pela atenção

Respondendo as suas perguntas:

*JNA deixa transparente o uso do c++ quando você mapeia um assembly. É como mapear uma dll usando java.
*JNI é uma saída mais robusta que JNA apesar de mais complicada e funciona com a linguagem “c”(JNA acaba com o desempenho da aplicação por executar diversos ios desnecessários).

Uma pergunta. Compensa fazer esse mapeamento com java em cima de bibliotecas nativas?
Na minha opinião não. É preferível utilizar diretamente c++ para resolver problemas que a jvm não pode. Existem muitas ferramentas boas para linux que podem facilitar o desenvolvimento da sua aplicação.

A

Então julio…

O pq de tudo isso eh que ja tenho as duas aplicações feitas, a do C++ e a do Java e ambas são complexas,

tornando naum trivial eu implementar tudo em C++.

Eu fiz essa pergunta pq achei JNA muito facil e o JNI me da muita dor de cabeça, pois são muitos métodos que preciso mapear e naum entendi direito…

Mas naum me respondeu a pergunta… JNA mapea C++ para JAVA, sim ou naum? Se naum vc teria um tutorial sobre JNI para facilitar o meu entendimento? E se sim como?

Vlw pela atenção…

ABS…

J

AnthonyLaMarca:
Então julio…

O pq de tudo isso eh que ja tenho as duas aplicações feitas, a do C++ e a do Java e ambas são complexas,

tornando naum trivial eu implementar tudo em C++.

Eu fiz essa pergunta pq achei JNA muito facil e o JNI me da muita dor de cabeça, pois são muitos métodos que preciso mapear e naum entendi direito…

Mas naum me respondeu a pergunta… JNA mapea C++ para JAVA, sim ou naum? Se naum vc teria um tutorial sobre JNI para facilitar o meu entendimento? E se sim como?

Vlw pela atenção…

ABS…

JNA mapeia assemblyes c++ sim, e de maneira simples. Ela deixa transparente o uso do c++, e você pode codificar toda a interface em java(O problema é que toda vez que você chamar o método da interface vai haver io, e isso acaba com o desempenho da sua aplicação). A solução nativa mantém essas chamadas carregadas na memória.:

Para jni, existe um livro muito bom online nesse link:
java.sun.com/docs/books/jni/download/jni.pdf

A

Então Julio…

Eu fiz uns procedimentos e gerei o meu .so dos arquivos h. e .c e através do JNA, consegui fazer o Java acessar as funções da biblioteca .so

Dae fiz os mesmos procedimentos e gerei o .so dos aquivos .h e .cpp e quando vo acessar os metodos desta biblioteca .so, atraves do Java pelo JNA, da erro…

Vc saberia o pq? Tem que fazer alguma coisa diferente? Vc saberia me explicar? Ou teria algum site que explica isso?

Vlw…

ABS

J

Olha, acabei de ver num forum que JNA não vai conseguir mapear classes e objetos c++, então ignora meu post lá em cima e me desculpe pelo engano.
Encontrei um post na stackoverflow que pode ser interessante para você e fala justamente sobre isso.

A

Então julio, parti para o JNI mas to tento problemas…

Quando uso um arquivo em c da tudo certo, quando altero esse arquivo para cpp da erro, e os dois arquivos possuem o mesmo código.

Procurei na net e so tem exemplos com arquivo .c, .cpp naum achei nada?

.cpp da o seguinte erro

Exception in thread main java.lang.UnsatisfiedLinkError: /home/anthony/JNI/libolanativo.so: /home/anthony/JNI/libolanativo.so: undefined symbol: __gxx_personality_v0

at java.lang.ClassLoader$NativeLibrary.load(Native Method)

at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1675)

at java.lang.Runtime.loadLibrary0(Runtime.java:840)

at java.lang.System.loadLibrary(System.java:1047)

at OlaMundo.(OlaMundo.java:5)

Could not find the main class: OlaMundo. Program will exit.

Vc saberia me explicar o que eh isso, ou qual seria o problema e o que eu posso fazer?

Vlw Anthony…

A

O julio descobri o erro mas vlw pela atenção…

Poxa um erro Horrivel, que burrisse…

Tava compilando tudo com gcc e nem tava percebendo, troquei para g++ deu certo…

Mas vlw…

J

AnthonyLaMarca:
O julio descobri o erro mas vlw pela atenção…

Poxa um erro Horrivel, que burrisse…

Tava compilando tudo com gcc e nem tava percebendo, troquei para g++ deu certo…

Mas vlw…

opa, blz…

Criado 17 de abril de 2009
Ultima resposta 23 de mar. de 2011
Respostas 20
Participantes 5