Pular para o conteúdo

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

Dica publicada em Linux / Introdução
Wagner Silva vvagner.silva
Hits: 7.181 Categoria: Linux Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar

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

Nenhuma dica encontrada.

Como instalar o seu hp-plugin? Contornando o erro

Cache de DNS no RHEL 6 (Red Hat Enterprise 6)

Efeitos do Desktop 3D no Ubuntu 7.04

O que vem de novo no Ubuntu 8.04 Hardy Heron

Um autoinstall.yaml para Ubuntu com foco em quem vai fazer máquina virtual

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.