现在的位置: 首页 > 综合 > 正文

关于C++调用jar包,在创建虚拟机时使用JNI_CreateJavaVM调用失败返回-1的问题

2013年08月06日 ⁄ 综合 ⁄ 共 1162字 ⁄ 字号 评论关闭

    今天测试程序时发现,之前调试可用的C++调jar的程序突然出现问题了,总是在创建java虚拟机的时候出现问题。

    在调用JNI_CreateJavaVM函数时总是返回-1,在网上查了一下,有一个说法是

可能是跟本地包含有多个虚拟机环境有关,调用此函数总是返回-1, 创建虚拟机失败。

解决方法是使用LoadLibrary和GetProcAddress直接加载制定的jvm的JNI_CreateJavaVM。

按这个思路查了一下 系统中是不是有多个虚拟机环境

 vi ld.so.cache 打开这个文件查了一下libjvm.so有几个 结果发现确实有两个

^@libjvm.so^@/usr/java/jdk1.5.0_04/jre/lib/amd64/server/libjvm.so^@libjvm.so^@/lib/libjvm.so

/usr/java/jdk1.5.0_04/jre/lib/amd64/server/libjvm.so

/lib/libjvm.so

按照之前的用法 用的是/usr/java/jdk1.5.0_04/jre/lib/amd64/server/libjvm.so这个so

所以尝试着把/lib/libjvm.so这个文件删掉 

再ldconfig一下  ld.so.cache里就剩上面那个so了

重新再调试C++掉jar包的程序 果然可以了

这是一种解决办法

按另一种解释明确指定所要加载的那个so 也应该可以用  可以试一试

       JavaVMOption options[4];
        /*设置初始化参数*/
        options[0].optionString = "-Djava.compiler=NONE";  
        options[1].optionString = "-Djava.class.path=.:../lib/jym.jar:../lib/codeutil.jar";
        options[2].optionString = "-Djava.library.path=/usr/java/jdk1.5.0_04/jre/lib/amd64/server";  //指定加载的so路径
        options[3].optionString = "-verbose:NONE"; //用于跟踪运行时的信息

        /*版本号设置不能漏*/
        vm_args.version=JNI_VERSION_1_4;//jdk版本1.4
        vm_args.nOptions = 4;
        vm_args.options = options;
        vm_args.ignoreUnrecognized = JNI_TRUE;
        res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

抱歉!评论已关闭.