Monday, July 11, 2011

Invoke a java method from c++

#include
#include
#include
#include
#include

JNIEnv* create_vm(JavaVM ** jvm) {

JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
options[0].optionString = "-Djava.class.path=D:\\java\\Excel\\Excel\\dist\\Excel.jar"; //Path to the java source code

vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = 0;

int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if(ret < 0) printf("\nUnable to Launch JVM\n"); return env; } int main(int argc, char* argv[]) { std::ifstream l_ifstream; char * l_buffer; int l_lenght; l_ifstream.open("ExampleSimple.xml"); l_ifstream.seekg(0, std::ios::end); l_lenght = l_ifstream.tellg(); l_ifstream.seekg(0, std::ios::beg); l_buffer = new char[l_lenght+1]; l_ifstream.read(l_buffer, l_lenght); l_ifstream.close(); l_buffer[l_lenght]='\0'; JNIEnv *env; JavaVM * jvm; env = create_vm(&jvm); if (env == NULL) return 1; jclass l_excelCreatorClass = NULL; jmethodID l_methodCreateWorkBook = NULL; jobject l_inpuXmlString = NULL; jobject l_outPutFile = NULL; jobject l_boolReturn = NULL; jstring l_jxmlstring = env->NewStringUTF(l_buffer);
jstring l_joutFile = env->NewStringUTF("ExampleCPP.xlsx");


l_excelCreatorClass = env->FindClass("com/excel/xl/TTExcelCreator");

if (env->ExceptionOccurred()) {
env->ExceptionDescribe();
}

if(l_excelCreatorClass)
{
l_methodCreateWorkBook = env->GetStaticMethodID(l_excelCreatorClass, "createWorkBook", "(Ljava/lang/String;Ljava/lang/String;)Z");

}
else
{
printf("\nUnable to find the requested class\n");
}

if(l_methodCreateWorkBook)
{

jboolean l_jbresult =(jboolean)env->CallBooleanMethod(l_excelCreatorClass,l_methodCreateWorkBook,l_jxmlstring,l_joutFile);

if(l_jbresult)
{
printf("success");
}
else
{
printf("error");
}
}
else
{
printf("\nUnable to find the requested method\n")
}
}