linux: C++ create JVM to invoke Java method

来源:互联网 发布:淘宝客服发展前景 编辑:程序博客网 时间:2024/06/05 06:41

在C++代码中创建虚拟机直接调用java自身的类较为简单,见C++ 代码创建虚拟机调用java方法,调用自身定义的java类中的方法稍微有些不同,以下代码为C++本地化方法中创建虚拟机然后调用java函数的方法示例。

文件结构图如下:

jhh@jhh:~/practise/invokde_jni$ ls
a.out  main.cpp  myworkspacepackage
jhh@jhh:~/practise/invokde_jni$ tree .
.
|-- a.out
|-- main.cpp
`-- myworkspacepackage
    |-- HelloWorld.class
    `-- HelloWorld.java

创建myworkspacepackage目录,进入到myworkspacepackage编辑HelloWorld.java文件

HelloWorld.java

package myworkspacepackage;public class HelloWorld{    public HelloWorld(){    }       static public void sayHello(){        System.out.println("----sayHello method from HelloWorld class-----");    }   }

编译HelloWorld.java文件

$ javac HelloWorld.java

生成HelloWorld.class  文件


退出到上一级目录编辑main.cpp  文件

#include <jni.h>#include <stdio.h>#include <stdlib.h>int main(int argc,char **argv){    JNIEnv *env;    JavaVM *jvm;    jint res;    jclass cls;    jmethodID mid;    jstring jstr;    jclass stringClass;    jobjectArray args;    char optionString[] = "-Djava.class.path=.";    JavaVMInitArgs vm_args;    JavaVMOption options[1];    options[0].optionString = optionString;    //  "-Djava.class.path=."; // or "-Djava.class.path=/home/jhh/practise/invokde_jni/"; //OK    /*      options[1].optionString =        "-verbose";    options[2].optionString = "-verbose:jni";    */    vm_args.version = JNI_VERSION_1_6;    vm_args.options = options;    vm_args.nOptions = 1;        vm_args.ignoreUnrecognized = JNI_FALSE;    /* Create the Java VM */    res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);    if (res < 0) {        fprintf(stderr, "Can't create Java VM\n");        exit(1);    }       if ((env)->ExceptionOccurred()) {        (env)->ExceptionDescribe();    }       cls = (env)->FindClass("myworkspacepackage/HelloWorld");    if (cls == NULL) {        if ((env)->ExceptionOccurred()) {            (env)->ExceptionDescribe();        }        printf("Failed to get class\n");        exit(1);    }        printf("-----in main.cpp, will get printJavaHelloWorld method to call------\n");    jmethodID staticMethodID = env->GetStaticMethodID(cls, "sayHello", "()V");    env->CallStaticVoidMethod(cls, staticMethodID);    (jvm)->DestroyJavaVM();}
编译

$pwd
/home/jhh/practise/invokde_jni

$ export LD_LIBRARY_PATH=/sziauto/android_develop/tools/jdk1.6.0_26/jre/lib/i386/server/

$  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

即可看到打印结果

-----in main.cpp, will get printJavaHelloWorld method to call------
----sayHello method from HelloWorld class-----

运行环境:ubuntu 10.04

注:编译的时候是在main.cpp 所在的目录下编辑的,否则的话总是提醒找不到类定义的错误。