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?
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++.
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.
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.
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.
[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.
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?
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.:
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?
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?