Nesta dica vamos aprender a efetuar chamada de métodos de uma classe Java no código C++ com o uso de JNI (
Java Native Interface).
Código Java
Começaremos com uma classe de teste 
Java onde o código C++ efetuará as chamadas.
public class TesteJava
{
   public static int intMethod(int n)
   {
      System.out.println("TesteJava: Método estático intMethod: n = " + n);
      return (n * n);
   }
   public static boolean booleanMethod(boolean bool)
   {
      System.out.println("TesteJava: Método estático booleanMethod");
      return (!bool);
   }
}
 
Código C++
/**
* Arquivo main.cpp
*/
#include <jni.h>
#include <memory.h>
#include <stdio.h>
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif
int main()
{
    JavaVMOption options[1];
    JNIEnv *env;
    JavaVM *jvm;
    JavaVMInitArgs vm_args;
    long status;
    jclass cls;
    jmethodID mid;
    jint square;
    jboolean _not;
    options[0].optionString = "-Djava.class.path=.";
    memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_2;
    vm_args.nOptions = 1;
    vm_args.options = options;
    status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    if (status != JNI_ERR)
    {
        cls = env->FindClass("TesteJava");
        if (cls != 0)
        {
            mid = env->GetStaticMethodID(cls, "intMethod", "(I)I");
            if (mid != 0)
            {
                square = env->CallStaticIntMethod(cls, mid, 5);
                printf("main.cpp: Retorno da função intMethod: %d\n", square);
            }
            mid = env->GetStaticMethodID(cls, "booleanMethod", "(Z)Z");
            if (mid != 0)
            {
                _not = env->CallStaticBooleanMethod(cls, mid, 1);
                printf("main.cpp: Retorno da função booleanMethod: %d\n", _not);
            }
        }
    getchar();
    jvm->DestroyJavaVM();
    return (0);
    }
    else
    {
        return (-1);
    }
}
Executando...
Para compilar o código fonte devemos  atentar-nos a alguns detalhes:
1) Exporte os diretórios onde estarão as libs: libjava.so e libjvm.so.
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/java/jdk1.6.0_10/lib:\
/usr/java/jdk1.6.0_10/jre/lib/i386:/usr/java/jdk1.6.0_10/jre/lib/i386/client
Obs.: No meu caso em especifico instalei o jdk1.6.0_10 em /usr/java.
2) Compile o código C++ para gerar o binário.
# g++ -I/usr/java/jdk1.6.0_10/include/ -I/usr/java/jdk1.6.0_10/include/linux/ -L/usr/java/jdk1.6.0_10/jre/lib/i386 -L/usr/java/jdk1.6.0_10/jre/lib/i386/client -ljava -ljvm main.cpp
3) Execute ./a.out.
# ./a.out
Saída:
TesteJava: Método estático intMethod: n = 5
main.cpp: Retorno da função intMethod: 25
TesteJava: Método estático booleanMethod
main.cpp: Retorno da função booleanMethod: 0
Nenhum comentário foi encontrado.