Como chamar funções Java do C ++?

Como posso chamar funções Java de um aplicativo C ++?

Eu sei sobre chamá-los de CMD (ou técnicas semelhantes), mas eu prefiro não usá-los.

Por exemplo, selecione Criando uma JVM a partir de C. Ele mostra um procedimento de amostra para criar uma JVM e chamar um método. Se a JVM já existir; por exemplo, seu programa C é chamado pelo programa Java (situação de retorno de chamada), você pode armazenar em cache o ponteiro JNIEnv *.

Como um conselho, tenha pointers de cache cuidadosos para a JVM a partir de C / C ++, há alguma semântica envolvida quanto ao que você pode armazenar em cache e pode ser chamado mais tarde. Para isso, como Brian Agnew apontou, verifique a referência JNI.

Confira a interface de invocação do JNI . Isso permitirá que você incorpore uma JVM em seu aplicativo C (ou C ++).

Note que existem vários mecanismos mais fáceis para facilitar a chamada de C / C ++ de Java (por exemplo, JNA ). Pode valer a pena considerar inverter o seu problema de tal forma que você pode chamar de Java (eu entendo isso pode não ser possível para o seu aplicativo em particular, no entanto)

Esta página é útil: http://hildstrom.com/projects/jni/index.html

Suponha que você tenha uma class Java:

package foo; public class bar { public static int timesTen(int input){ return input * 10; } } 

Depois de ter uma JVM e JNIEnv * (detalhes omitidos …), você pode chamar o método Java de C ++ da seguinte maneira:

 jclass myClass = env->FindClass("foo.bar"); jmethodID mid = env->GetStaticMethodID(myClass, "timesTen", "(I)I"); jint hundred = env->CallStaticIntMethod(myClass, mid, (jint)10); 

Isso oculta muitos detalhes, incluindo o tratamento de exceções, que, se omitido, irá travar sua JVM. Para todos os detalhes gory procure em “Java Native Interface” e siga os links da Oracle.

Leia sobre JNI .

A Sun tem um exemplo muito bom e básico de JNI .

Outra maneira simples de chamar os methods Java do CPP é através do arquivo em lote.

 system() 

É o método para chamar arquivos exe ou bat do CPP. Coloque sua class com o caminho java e o caminho de class no arquivo em lote e chame esse arquivo em lote do CPP usando o system("batch-file-name.bat") .

É fácil e direto.