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

Publicado por Wagner Silva em 27/02/2008

[ Hits: 6.574 ]

 


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

PHPMailer - Validação de campos, e-mail e domínio para formulário de contato e envio

FreeBSD 7.0 CURRENT para STABLE de forma simples

Criando listas individuais para cada instância da mesma classe em Python

Asterisk como SIP Proxy

Menu popup dinânico (DHTML) com infinitos níveis usando apenas CSS

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts