linux: C++ create JVM to invoke Java method

在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 所在的目录下编辑的,否则的话总是提醒找不到类定义的错误。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值