在Java 1.7.0_40上调用JNI_CreateJavaVM()崩溃

时间:2014-09-02 11:10:23

标签: java c++ crash java-native-interface

以下代码大部分时间都成功,但有时会导致程序崩溃(所有线程都以代码1退出)。

string classpath;
JavaVMOption options[6];

std::string heapOptionString = "-Xms500m"; //Important !!! please adjust when needed, default is 1GB of RAM usage = "-Xms1g"
std::string jmxOptionString = "-Dcom.sun.management.jmxremote";
std::string unlockCFOptionString = "-XX:+UnlockCommercialFeatures";
std::string flightRecOptionString = "-XX:+FlightRecorder";
std::string useGC1 = "-XX:+UseG1GC";

options[0].optionString = new char[classpath.size()+1];
strcpy_s(options[0].optionString, classpath.size()+1,classpath.c_str());
options[1].optionString = new char[heapOptionString.size()+1];
strcpy_s(options[1].optionString, heapOptionString.size()+1,heapOptionString.c_str());
options[2].optionString = new char[jmxOptionString.size()+1];
strcpy_s(options[2].optionString, jmxOptionString.size()+1, jmxOptionString.c_str());
options[3].optionString = new char[unlockCFOptionString.size()+1];
strcpy_s(options[3].optionString, unlockCFOptionString.size()+1, unlockCFOptionString.c_str());
options[4].optionString = new char[flightRecOptionString.size()+1];
strcpy_s(options[4].optionString, flightRecOptionString.size()+1, flightRecOptionString.c_str());
options[5].optionString = new char[useGC1.size()+1];
strcpy_s(options[5].optionString, useGC1.size()+1, useGC1.c_str());

vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 6;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;

int ret = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

它是不一致的 - 有时我能够在白天多次运行我的应用程序,但一旦出现问题 - 它每次都崩溃,解决它的唯一方法是注销并再次登录(某些java服务)挂在记忆中?)。

我已经检查过有关通过JNI创建VM的SO的其他问题,但它们似乎与其他原因有关(Java 1.6中的旧错误应该立即修复)或者有不同的情况 - 即100%可重现的崩溃。

编辑:我还应该提一下,这段代码是类中方法的一部分,它本质上是我正在使用的JAVA库的包装器。它也是从非主线程执行的,并且之前没有任何JNI调用。

0 个答案:

没有答案