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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值