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

Publicado por Wagner Silva em 27/02/2008

[ Hits: 6.992 ]

 


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

Alterando o tema do KDM (KDM Theme Manager)

Dolphin File Manager + Private Key

Como configurar o Chronyc no CentOS 7 e Red Hat 7

Aumentando área de SWAP sem boot ou reinstalação em LVM

Turbinando Firefox

  

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