Boa tarde galera…
Atualmente estou com um “pobleminha”…
Aqui na empresa onde trabalha, estamos realizando uma migração de tecnologia, sendo ela de C++ para JAVA e teremos utilização também na Web com PHP…
Temos algumas classes em C++ com diversas operações financeiras, eu sei que parece um serviço meio de porco, mas eu gostaria de reaproveitar ela, sabe como é, sobre carga em cima do programador… ¬¬
Gostaria de saber se vcs conhecem algo que me ajude quanto a isso??? Não quero reescrever tudo de novo agora, tenho uma série de coisas a fazer, é muita coisa, se eu conseguir reaproveitar essa classe já poderei entregar o módulo do departamento financeiro e uma parte do comercial… Depois eu faço ela com calma, quando eu tiver tudo em ordem!!!
Obrigado galera…
Acho que é mais rápido reescrever (no caso do Java), pela minha própria experiência; já ouvi falar que no caso do PHP é possível reaproveitar o código C++ com relativa facilidade - mas é de ouvir falar, não de realmente ter botado a mão na massa.
Com o PHP acho que você pode consultar a documentação sobre como escrever extensões para linguagem, e criar uma que utilize esse “código C++”.
Para Java acho que JNI resolve.
Mas como foi dito, vai ficar meio esquisito isso.
Compartilho da opinião do Entanglement. Interoperabilidade de Java e C++ é possível, mas é difícil, sujeita a erros e só deve ser usada quando estritamente necessário.
Bom… Li sobre JNI e realmente é um pouco chato trabalhar com ele, quanto ao PHP é tranquilo… Já fiz esse procedimento algumas vezes e deu certo. Mas eu precisava fazer isso no JAVA… Ai complicou…
Na verdade seria uma gamb temporária, já que eu faria essa adaptação pra ganhar tempo com outras partes do sistema… Mas infelizmente, devido a complexidade levarei o trabalho pra ksa e vou fazer lá, acredito que até depois de amanhã eu entregue esse módulo que precisa apenas dessas classes pra executar as regras de negócio…
De qualquer forma agradeço e, vou ler mais sobre o JNI…
Obrigado pela ajuda de todos…
Obrigado galera… Boa tarde!!!
Dê uma olhada no JNA também. Dependendo de como sua aplicação C++ estiver organizada, daria para usa-lo.
Outra opção é criar lá um socket, abrir uma conexão entre as duas aplicações, e comunica-se através de comandos num protocolo que vc especificar. Pode soar trabalhoso, mas as vezes é bem mais prático que JNA e JNI.
[quote=ViniGodoy]Dê uma olhada no JNA também. Dependendo de como sua aplicação C++ estiver organizada, daria para usa-lo.
Outra opção é criar lá um socket, abrir uma conexão entre as duas aplicações, e comunica-se através de comandos num protocolo que vc especificar. Pode soar trabalhoso, mas as vezes é bem mais prático que JNA e JNI.[/quote]
Aqui na empresa já usaram isso, sockets para comunicar entre aplicações C++ e Java, porque a JNI/JNA é meio bugada em alguns aspectos. Foi bem mais fácil pra nós.
Uma das vantagens dessa abordagem, na minha opinião, é que as aplicações ficam completamente isoladas. Assim, não é possível que a JM aborte por um problema de alocação de memória ocorrido no C++, e a VM é bastante sensível ao mau uso da memória. Quando a aplicação aborta por isso é geralmente com um erro feio, difícil de entender e virtualmente impossível de debugar.
E é sempre possível fazer a aplicação java disparar a aplicação C++ caso ela caia.
Uma das vantagens dessa abordagem, na minha opinião, é que as aplicações ficam completamente isoladas. Assim, não é possível que a JM aborte por um problema de alocação de memória ocorrido no C++, e a VM é bastante sensível ao mau uso da memória. Quando a aplicação aborta por isso é geralmente com um erro feio, difícil de entender e virtualmente impossível de debugar.
E é sempre possível fazer a aplicação java disparar a aplicação C++ caso ela caia. [/quote]
Uma outra coisa que eu já fiz quando precisei integrar uma aplicação Java com outra C++ foi desenvolver um executável em C++ e chamá-lo no Java usando runtime.exe();
Eu pegava a inputStream da execução da aplicação para ler as respostas e no c++ eu usava
int main(int argc, char** argv)
para passar parâmetros para o meu aplicativo em C++.
Eu sempre evito à todo custo usar JNA/JNI, pois ela sempre se mostra a alternativa mais difícil e mais propensa à erros de difícil correção.
Uma das vantagens dessa abordagem, na minha opinião, é que as aplicações ficam completamente isoladas. Assim, não é possível que a JM aborte por um problema de alocação de memória ocorrido no C++, e a VM é bastante sensível ao mau uso da memória. Quando a aplicação aborta por isso é geralmente com um erro feio, difícil de entender e virtualmente impossível de debugar.
E é sempre possível fazer a aplicação java disparar a aplicação C++ caso ela caia. [/quote]
Uma outra coisa que eu já fiz quando precisei integrar uma aplicação Java com outra C++ foi desenvolver um executável em C++ e chamá-lo no Java usando runtime.exe();
Eu pegava a inputStream da execução da aplicação para ler as respostas e no c++ eu usava
int main(int argc, char** argv)
para passar parâmetros para o meu aplicativo em C++.
Eu sempre evito à todo custo usar JNA/JNI, pois ela sempre se mostra a alternativa mais difícil e mais propensa à erros de difícil correção.[/quote]
Você tem razão. Mapear memória não gerenciada além de trabalhoso vai deixar o seu projeto comprometido posteriormente. É fácil gerar um leak subindo apontadores c++ para objetos java. O tempo que se leva tratando esses erros pode não compensar o tempo que se leva escrevendo
Sendo que memória é apenas um dos problemas que a JNA/JNI pode apresentar. Às vezes pode ocorrer erro de linkagem, a DLL que será chamada no Java pode depender de uma biblioteca que não foi corretamente registrada no computador do usuário, ou então está corrompida, ou até mesmo com uma versão diferente.