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

    今天测试程序时发现,之前调试可用的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);




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值