C++ 代码创建虚拟机调用java方法

Java和C/C++代码的互相调用一般都是采用JNI的方法,首先Java类J通过native函数调用在对应的C++文件C中的方法,C文件保存相应的虚拟机和JNIEnv等变量,获取java类中的方法或者属性的ID,进而回调J中的方法。但有时候需要直接从C++的方法中调用java的方法,这就需要在C++代码中创建虚拟机,从而直接调用java中的代码。

#include<jni.h>

#include<stdio.h>

intmain(intargc,char**argv){

JavaVM*vm;

JNIEnv*env;

JavaVMInitArgsvm_args;

vm_args.version=JNI_VERSION_1_4;

vm_args.nOptions=0;

vm_args.ignoreUnrecognized=1;

//ConstructaVM

jintres=JNI_CreateJavaVM(&vm,(void**)&env,&vm_args);

//ConstructaString

jstringjstr=env->NewStringUTF("HelloWorld");

//Firstgettheclassthatcontainsthemethodyouneedtocall

jclassclazz=env->FindClass("java/lang/String");

//Getthemethodthatyouwanttocall

jmethodIDto_lower=env->GetMethodID(clazz,"toLowerCase","()Ljava/lang/String;");

//Callthemethodontheobject

jobjectresult=env->CallObjectMethod(jstr,to_lower);

//GetaC-stylestring

constchar*str=env->GetStringUTFChars((jstring)result,NULL);

printf("%s\n",str);

//Cleanup

env->ReleaseStringUTFChars(jstr,str);

//ShutdowntheVM.

vm->DestroyJavaVM();

}

编译如下:

$exportLD_LIBRARY_PATH=/....../jdk1.6.0_26/jre/lib/i386/server/#路径指向包含libjvm.so文件的目录

$g++-I/....../jdk1.6.0_26/include/-I/....../jdk1.6.0_26/include/linux/-L/....../jdk1.6.0_26/jre/lib/i386/server/-ljvmmain.cpp

$./a.out

即可看到程序的输出的结果

运行环境:uBuntu10.04

相关推荐