您的位置:首页 > 编程语言 > C语言/C++

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

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

代码如下:(main.cpp)

#include <jni.h>
#include <stdio.h>

int main(int argc, char** argv){
JavaVM* vm;
JNIEnv* env;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 0;
vm_args.ignoreUnrecognized = 1;
// Construct a VM
jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
// Construct a String
jstring jstr = env->NewStringUTF("Hello World");
// First get the class that contains the method you need to call
jclass clazz = env->FindClass("java/lang/String");
// Get the method that you want to call
jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;");
// Call the method on the object
jobject result = env->CallObjectMethod(jstr, to_lower);
// Get a C-style string
const char* str = env->GetStringUTFChars((jstring) result, NULL);
printf("%s\n", str);
// Clean up
env->ReleaseStringUTFChars(jstr, str);
// Shutdown the VM.
vm->DestroyJavaVM();

}


编译如下:

$ export LD_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/ -ljvm main.cpp

$./a.out

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

运行环境:uBuntu 10.04

调用自定义类中的方法的例子见 linux: cpp create JVM to invoke Java method
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐