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

Publicado por Wagner Silva em 27/02/2008

[ Hits: 6.403 ]

 


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

Instalando e configurando streaming de arquivo MP4 no FFmpeg - Ubuntu Server

Acessando uma partição NTFS (leitura) como usuário comum no Debian Linux

Instalando Skype 32 bits no Debian Squeeze amd64

Real Player no KUbuntu 7.04

FlareGet, acelerador de downloads no Ubuntu

  

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