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