Chamada de código Java através de programas C++

Publicado por Wagner Silva em 27/02/2008

[ Hits: 6.079 ]

 


Chamada de código Java através de programas C++



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

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Manipulando arquivos PDF no terminal

Ufraw - Tratando e revelando arquivos raw

Cacti em distribuições Debian - Instalando plugins

Migrando a base OpenLDAP de BDB para HDB

Configuração da placa de captura encore ENLTV-FM-2 no Ubuntu 9.10

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário