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