Bridge C++ Java

Pessoal,

Estou com o seguinte desafio. Preciso criar uma ponte entre uma aplicação C++ e aplicações Java. Isto é, preciso que aplicações Java sejam executadas dentro de uma aplicação em C++, de forma transparente. O usuário não precisa saber que existe uma aplicação Java que está em execução para a realização da tarefa.

Sei que através de JNI consigo fazer a chamada de um procedimento em C++, por exemplo. Contudo preciso que o Java esteja “embutido” na aplicação em C++. O display na tela deverá ser feito através da própria janela do programa em C++, e não através de uma janela java, separada.

Alguém tem idéia de como fazer isso, ou alguma indicação de bibliografia/tutoriais ?

Abraço

Nunca havia visto necessidade parecida com esta, porém achei interessante … e fiquei curioso.
Após esta consulta ao oráculo (conhecido também por Google), cheguei a dois links interessantes que podem te ajudar.

Primeiro, “link-forum” interessante:
http://forum.java.sun.com/thread.jspa?threadID=541654&messageID=2626345
Aqui tem uma resposta interessante que, basicamente resumi o tópico (mas não deixe de ver todos os posts!):

[quote]1) If you want to use CORBA (it’s not difficult) try OmniORB (omniorb.sourceforge.net). It deserves a tutorial like the Orbacus tutorial that was posted in a link above.

  1. You can try Web Services (the cure for all - for instance, it promises to make Java and .NET happy together…). You can define your EJB as an Web Service endpoint and your C++ app as the other Web service endpoint.

Overhead: high (really high - but it puts your EJB design to a heavy proof).
Complexity: medium to low.
Maintainability: promises to be high (everyone seems to know something about Web Services - just drive a job interview, or go to some Java or .NET conference…).
Interoperability: high.
Flexibility: high.
Portability: you need to find a portable (and preferably open-source) Web Services toolkit. Just using the Web Services toolkit from Microsoft will tie you eternally to Microsoft in the C++ app (but if you’ve written it using MFC or ATL you’re just married to Microsoft at all…).[/quote]

Segundo “link-artigo” interessante. http://jovial.com/javaAndCpp/java_and_cpp.html
Porém após uma passada de olho rápida, vi que era coisa antiga, no final está falando do que promete o jdk 1.1 …
recomendo não implementar nada nos “moldes” deste artigo, mas acredito que deve ter conceitos interessantes no minimo.

Qualquer coisa, visitando a consulta acima tem muito mais.
flw e sucesso.
ps: nunca trabalhei com c++ e o conheço pouco por sinal, por isso não posso te ajudar mais que isso. 8)

humilde opinião: Acredito que a melhor maneira de fazer esta integração é através de webservices, se a
situação do projeto permitir.

Roger Leite

Roger,

Obrigado pela pronta resposta. Então, no caso eu acho difícil o uso de webservices. Trata-se de uma aplicação embarcada, rodando direto em cima do SO, onde precisarei que programas Java sejam executados.

Haverá um gerenciador de aplicações, responsável por iniciar e finalizar as aplicações Java, semelhante ao que ocorre com telefones celulares. Mas não posso utilizar as bibliotecas gráficas do Java para dar o display na tela. Todas as operações que ocorram em baixo nível deverão ser feitas através de um conjunto de bibliotecas, desenvolvidas em C++, que acessam o framebuffer do dispositivo e plotam os pixels. As aplicações em Java deverão estar integradas ao gerenciador de aplicações (possui interface gráfica), que é feito em C++.

Alguma idéia?

Imaginei que você responderia algo do tipo … o que resta então é analisar quais dos dois casos é melhor pro seu projeto:

Primeiro, pelo que eu entendi (veja bem, posso estar errado), temos aqui um JNI "ao contrário":
http://java.sun.com/docs/books/jni/html/invoke.html#11202

Segundo, chamar EJBs através de CORBA, tipo um RMI de C++ -> Java:
http://java.sun.com/j2se/1.4.2/docs/guide/rmi-iiop/interop.html

Parece que tem bastante material do assunto pela net, pensei que fosse mais raro.
Como não apareceu ninguém com experiência para ajudar, seria uma boa você postar a "solução" que usar,
pois fica aqui documentado.

flw e sucesso!

Roger Leite

Cara, esse dispositivo embarcado possui uma máquina virtual Java?

Falo isso, porque há um ano atrás eu estudei um pouco de JNI (já esqueci bastante coisa hoje) e vi que quando uma aplicação C++ roda um jar, tem que abrir uma máquina virtual antes. E assim, se não houver a JVM, não adianta nada.

Sobre o tal post ( http://forum.java.sun.com/thread.jspa?threadID=541654&messageID=2626345 ) fui eu que o escrevi. Que coincidência :stuck_out_tongue:

Um exemplo de um "wrapper" C++ -> Java são aqueles programas que transformam classes Java em serviços, como o JavaService.

Sim, Tenho a máquina virtual Java instalada…

Com JNI eu até tenho uma idéia de como fazer… Por favor me dêem uma opinião:

Terei que implementar as bibliotecas nativas pro meu SO em C++, e via JNI faço acesso a elas. Contudo isso vai implicar num grande trabalho, já que terei que re-implementar bibliotecas da JVM, tais como a java.awt, para que o display na tela seja feito através das minhas bibliotecas nativas. Esse é o caminho pra que uma aplicação Java faça o display dos dados através da minha aplicação C++. Até aí OK

Agora preciso fazer o caminho inverso. Preciso que uma biblioteca em C++ “inicie” a JVM e a aplicação. A JVM por sua vez usará minhas bibliotecas em C++ para dar o output no display.

É essa a solução mesmo?

[quote=thingol]Sobre o tal post ( http://forum.java.sun.com/thread.jspa?threadID=541654&messageID=2626345 ) fui eu que o escrevi. Que coincidência :stuck_out_tongue:
[/quote]

Thingol, você escreveu a pergunta ou a resposta que selecionei ?
Como nunca descobri seu nome real, sempre pensei que fosse algum “robo” do JForum com respostas excelentes … hehehe

Bom, pelo menos isso prova que estou bem de pesquisa!

flw, []s

Roger Leite

[quote=erickmelo]Sim, Tenho a máquina virtual Java instalada…

Com JNI eu até tenho uma idéia de como fazer… Por favor me dêem uma opinião:

Terei que implementar as bibliotecas nativas pro meu SO em C++, e via JNI faço acesso a elas. Contudo isso vai implicar num grande trabalho, já que terei que re-implementar bibliotecas da JVM, tais como a java.awt, para que o display na tela seja feito através das minhas bibliotecas nativas. Esse é o caminho pra que uma aplicação Java faça o display dos dados através da minha aplicação C++. Até aí OK

Agora preciso fazer o caminho inverso. Preciso que uma biblioteca em C++ “inicie” a JVM e a aplicação. A JVM por sua vez usará minhas bibliotecas em C++ para dar o output no display.

É essa a solução mesmo?[/quote]

Acho que o mais “fácil” a fazer neste caso, seria chamar a aplicação Java somente como uma lib,
você pega o(s) resultado(s) e mostra normalmente na app C++, numa tela feita por ti.

Se eu entendi bem o que quer fazer, mostrar uma app Java Swing (ou SWT ou AWT ou Thinlet …) dentro da sua C++
seria magia negra muito forte, o que provavelmente ocasionario num uso muito avançado de POG.

Você não tem esta possibilidade de chamar a parte Java como uma lib ?

sucesso!
Roger Leite

Roger,

Vc entendeu o espírito… Eu preciso exibir uma aplicação que utilize AWT dentro da minha em C++… Na verdade o projeto consiste em uma arquitetura que possibilite que aplicações diversas, feitas em Java, rodem na plataforma, de forma integrada, semelhante ao que o Google está fazendo com o projeto Android. Ou seja, estou criando um player em C++ para código Java.

Com relação ao uso da lib, como se enquadraria nesse contexto? Não entendi muito bem…

Pessoal,

Estive pesquisando e achei uma possível solução: http://www.kaffe.org/

Trata-se de uma implementação open-source da JVM.

Eles têm um FAQ específico pro AWT. Nele é descrito como compilar a JVM pra rodar utilizando a biblioteca GTK, pro AWT. Como a biblioteca GTK pode ser executada diretamente sobre o framebuffer, sem terminal X, etc, talvez resolva o meu problema. Desta forma evito ter q reescrever as bibliotecas do AWT, mas ainda tenho a necessidade de integrar as janelas do Java na minha aplicação em C++

http://www.kaffe.org/doc/kaffe/FAQ.awt

O que vcs acham do projeto? Alguém tem alguma experiência em projetos utilizando o Kaffe?

[]s

É Erick, entendi.
Sinto muito te informar, mas não tenho a minima idéia de como te ajudar neste.
Não tenho conhecimento suficiente para integrar C++ -> Java a este nivel que deseja.

Te recomendo a buscar soluções alternativas a este requisito do projeto, acredito que é
inviável fazer isto que deseja.

sem mais, vlw
Roger Leite

Exceto pela parte gráfica, acho totalmente possivel utilizando as propostas descritas aqui.

Agora, integrar uma tela AWT dentro da sua aplicação… humm… será divertido :slight_smile: