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
Nenhum comentário foi encontrado.