JNA com C++

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?

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

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++.

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++.

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.

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

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.

é 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 ?

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.

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

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?

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.

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

[quote=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[/quote]

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.

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…

[quote=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…[/quote]

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

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

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.

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…

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…