Converter Java para C++
Autor: Wiliam Silva | Publicado: 2013-09-08T23:35:00-03:00

Durante uma pesquisa corriqueira sobre JVMs, me deparei "acidentalmente" com um conversor de códigos em Java para código em C++ bastante interessante chamado J2C.

O J2C segundo o seu site garante a conversão na maior parte das vezes, certamente, códigos complexos como algorítimos utilizadores de ServerSocketChannel, SocketChannel e outras APIs sofisticadas do Java podem não ser de tanta confiança converter somente sem avaliar o comportamento do código em sua versão C++, mas para algorítimos corriqueiros, a conversão é certa e excelente.

Importante: O Java tem a garbage colletor (gc) e faça uma conversão consciente porque não existe coleta automática de objetos em C++.

O IDE dele é o Eclipse, portanto você deve possuir uma versão recente e compatível com JDK6.

O site do projeto J2C está em https://code.google.com/a/eclipselabs.org/p/j2c/.

A partir dele, você deve:


baixar o JAR mais recente do J2C;
após baixar o JAR, copie-o para a pasta $ECLISE_HOME$\dropins;
abra o Eclipse (no meu caso testei no Windows 7 com o Eclipse Juno);
clique sobre algum projeto Java na janela "Package Explorer";
você deve ver uma opção chamada "Translate to C++".


Esta ferramenta exige como você criar um pasta vazia de mesmo nome do seu projeto precedido pela letra "c". Exemplo: Se você tem um projeto chamado "OlaMundo", então deve ter uma pasta paralela e vazia chamada "cOlaMundo".

A classe Java 6 a seguir é simplesmente feita para ser convertida.

HelloWorld em Java 6 antes da conversão

public class HelloWorld {

 public static void main(String[] args) {

  System.out.println("Olá mundo!");
  
 }

}



HelloWorld em versão C++ após conversão




// Generated from /UmProjetoJava6/src/HelloWorld.java

#include &lt;HelloWorld.hpp&gt;



#include &lt;java/io/PrintStream.hpp&gt;

#include &lt;java/lang/NullPointerException.hpp&gt;

#include &lt;java/lang/String.hpp&gt;

#include &lt;java/lang/System.hpp&gt;



template&lt;typename ComponentType, typename... Bases&gt; struct SubArray;

namespace java

{

&nbsp; &nbsp; namespace io

&nbsp; &nbsp; {

typedef ::SubArray&lt; ::java::io::Serializable, ::java::lang::ObjectArray &gt; SerializableArray;

&nbsp; &nbsp; } // io



&nbsp; &nbsp; namespace lang

&nbsp; &nbsp; {

typedef ::SubArray&lt; ::java::lang::CharSequence, ObjectArray &gt; CharSequenceArray;

typedef ::SubArray&lt; ::java::lang::Comparable, ObjectArray &gt; ComparableArray;

typedef ::SubArray&lt; ::java::lang::String, ObjectArray, ::java::io::SerializableArray, ComparableArray, CharSequenceArray &gt; StringArray;

&nbsp; &nbsp; } // lang

} // java



template&lt;typename T&gt;

static T* npc(T* t)

{

&nbsp; &nbsp; if(!t) throw new ::java::lang::NullPointerException();

&nbsp; &nbsp; return t;

}



HelloWorld::HelloWorld(const ::default_init_tag&amp;)

&nbsp; &nbsp; : super(*static_cast&lt; ::default_init_tag* &gt;(0))

{

&nbsp; &nbsp; clinit();

}



HelloWorld::HelloWorld()

&nbsp; &nbsp; : HelloWorld(*static_cast&lt; ::default_init_tag* &gt;(0))

{

&nbsp; &nbsp; ctor();

}



void HelloWorld::main(::java::lang::StringArray* args)

{

&nbsp; &nbsp; clinit();

&nbsp; &nbsp; npc(::java::lang::System::out())-&gt;println(u"Olá mundo!"_j);

}



extern java::lang::Class *class_(const char16_t *c, int n);



java::lang::Class* HelloWorld::class_()

{

&nbsp; &nbsp; static ::java::lang::Class* c = ::class_(u"HelloWorld", 10);

&nbsp; &nbsp; return c;

}



java::lang::Class* HelloWorld::getClass0()

{

&nbsp; &nbsp; return class_();

}




É importante deixar claro que apenas mostrei a versão CPP da conversão, mas a ferramenta J2C gera outras classes e protótipos, subpastas para garantir a conversão. Depois basta ter um compilador de sua necessidade do código em C++ para uma plataforma de sua necessidade.



Para maiores informações, consulte a página oficial do projeto.



Espero ter algum oportunidade para utilizá-la em breve.