#include<jni.h>#include"libTeste.h"#include<stdio.h>JNIEXPORTjintJNICALLJava_my_package_Funcao1(JNIEnv*env,jclassobj){intret=17;return(jint)ret;}JNIEXPORTjbooleanJNICALLJava_my_package_Funcao2(JNIEnv*env,jobjectobj){Testa();returnJNI_TRUE;}JNIEXPORTvoidJNICALLJava_my_package_Funcao3(JNIEnv*env,jobjectobj){printf("Dinho Fazendo um Teste na chamada da função externa\n");return;}
Veja a resposta desse forum (no momento to sem tempo para reescrever seu programa):
É possível também criar um programa C ou C++, criar a jvm, e a partir do programa c/c++ chamar funções java, e do java funções nativas, etc… mais ou menos o que o javaw.exe faz… e o que alguns geradores de executaveis java fazem: http://www.inonit.com/cygwin/jni/invocationApi/c.html
D
DinhoPereira
jmmenezes:
é possivel mas não é simples assim!
Veja a resposta desse forum (no momento to sem tempo para reescrever seu programa):
É possível também criar um programa C ou C++, criar a jvm, e a partir do programa c/c++ chamar funções java, e do java funções nativas, etc… mais ou menos o que o javaw.exe faz… e o que alguns geradores de executaveis java fazem: http://www.inonit.com/cygwin/jni/invocationApi/c.html
Estou tentando com a função JNI_CreateJavaVM()
Mas não ta dando certo, o programa compila mas cai na condição de erro.
Cara… se você esta rodando primeiro o programa Java… a JVM que esta rodando precisa ser obtida e não criada!
Você só cria a JVM quando o ponto de partida é o programa C/C++ que depois vai chamar o programa Java.
Estou sem ambiente para testar aqui… se não conseguir resolver talvez consiga fazer este teste aqui…
D
DinhoPereira
jmmenezes:
Cara… se você esta rodando primeiro o programa Java… a JVM que esta rodando precisa ser obtida e não criada!
Você só cria a JVM quando o ponto de partida é o programa C/C++ que depois vai chamar o programa Java.
Estou sem ambiente para testar aqui… se não conseguir resolver talvez consiga fazer este teste aqui…
jmmenezes, show de bola, este é mesmo o caminho. Olhei o link que me passou o cheguei no seguinte código, e carrega a class:
(*env)->GetJavaVM(env,&jvm);smartCallbackObject=(*env)->NewGlobalRef(env,obj);//MyInstance = new AW_0001();if(smartCallbackClass==NULL){jclasslocalRefCls=(*env)->FindClass(env,"absoluta/web/AW_0001");if(localRefCls==NULL){printf("Unable to create a JNI Java Class reference \n");}else{printf("CARREGOU! \n");}//Create a global reference for JNI Java classsmartCallbackClass=(*env)->NewGlobalRef(env,localRefCls);//Delete the local reference as it is no longer needed(*env)->DeleteLocalRef(env,localRefCls);//Is the global reference created successfully?if(smartCallbackClass==NULL){printf("Unable to create JNI Java class reference \n");}}
Agora não sei como chamar um método dentro da classe.
vlwwww
D
DinhoPereira
Perfect. Seguindo as dicas do nosso amigo jmmenezes e fuçando em um e outro link chegamos no código funcional.
A idéia dessa integração, é mesclar o meu código com vários arquivos .so tornando-o mais seguro contra engenharia reversa, ok?
Aqui o código JAVA
publicclassMinhaClasse{publicMinhaClasse()throwsUnsatisfiedLinkError{System.loadLibrary("MinhaClasse");// Aqui carrega a lib .so}publicnativevoidFuncao3();// Se encarrega de chamar o método Testa() abaixo. publicvoidTestar(){System.out.println("Opa.. funcionandooooo!!!");}}
E aqui o código C
#include<jni.h>#include"package_MinhaClasse.h"jclasssmartCallbackClass;staticJavaVM*jvm=NULL;staticjobjectsmartCallbackObject=NULL;JNIEXPORTvoidJNICALLJava_package_Funcao3(JNIEnv*env,jobjectobj,jobjectcallback){(*env)->GetJavaVM(env,&jvm);smartCallbackObject=(*env)->NewGlobalRef(env,obj);if(smartCallbackClass==NULL){jclasslocalRefCls=(*env)->FindClass(env,"package/MinhaClasse");if(localRefCls==NULL){printf("Unable to create a JNI Java Class reference \n");}else{printf("CARREGOU! \n");}//Create a global reference for JNI Java classsmartCallbackClass=(*env)->NewGlobalRef(env,localRefCls);// Esse trecho abaixo faz a chamada do método Testar() em MinhaClasse()jclasscls=(*env)->GetObjectClass(env,smartCallbackObject);jmethodIDmid=(*env)->GetMethodID(env,cls,"Testar","()V");(*env)->CallVoidMethod(env,smartCallbackObject,mid);(*jvm)->DetachCurrentThread(jvm);//Delete the local reference as it is no longer needed(*env)->DeleteLocalRef(env,localRefCls);//Is the global reference created successfully?if(smartCallbackClass==NULL){printf("Unable to create JNI Java class reference \n");}}return;}
J
jmmenezes
Legal cara! Muito bom que deu certo! E legal ter postado a solução completa também!
Coloca o tópico como resolvido, desta forma se algum outro colega tiver essa mesma duvida, sabe que aqui terá a solução.