cls, вероятно, недействительно.Я предполагаю, что ваша программа потерпела бы крах раньше, если бы 'cres' был нулевым.
int main() {
JVMCreationResult* cres = CreateJavaVM();
if(!cres) return -1;
JavaVM* jvm = cres->jvm;
JNIEnv* env = cres->env;
jclass cls = env->FindClass("Main");
if(env->ExceptionCheck()) { // ClassNotFoundException ?
env->ExceptionDescribe();
env->ExceptionClear();
}
if(!cls) return -2; // this I think is your problem
jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); // the evil line
}
Вы уверены, что ваш classpath был указан правильно?Надеемся, что FindClass ("Main") найдет класс пакета по умолчанию.В любом случае сообщите нам возвращаемое значение, если ваш C / C ++ main () сейчас.
Это возможно для "JavaVM * jvm = cres-> jvm;"для оптимизации, поскольку на «jvm» никогда не ссылаются, а выражение «cres-> jvm» не имеет побочных эффектов.Некоторые комментаторы утверждают, что это должно привести к сбою, хм, да, может быть, если код был сгенерирован и затем выполнен.Но приличный компилятор может увидеть, что это не операция.
Однако утверждение "JNIEnv * env = cres-> env;"не может быть оптимизирован, так как переменная "env" используется позже.Таким образом, мы можем только утверждать, что если cres == 0, то он будет аварийно завершен в этот момент выполнения или до него.Поскольку «env» используется для вызова FindClass (), мы точно знаем, что env! = 0 и, следовательно, cres! = 0.
Я думаю, у вас есть проблема с установкой пути к классу, FindClass () ненайти ваш класс во время выполнения, что приводит к истинности "cls == 0".Вот мой ответ.
РЕДАКТИРОВАНИЕ: Я вижу, что другие утверждают по поводу «cres», однако это не меняет моего первоначального диагноза, но у вас все еще есть ошибка в отношении «cres», измените строку на:
JavaVMCreationResult* cres = new JavaVMCreationResult;
Я думаю, вам повезло, что cres указывает куда-то (вероятно, в стек), затем вы скопировали значения в локальный стек main () и использовали их.Но это не делает технику правильной, так как исходная память, на которую указывает «cres», случайна, поэтому вам повезло, что сбоев не произошло, но вы действительно писали на памяти, которой у вас не должно быть.Используя "cres = new JavaVMCreationResult;"это приводит к тому, что указатель устанавливается на известный действительный блок памяти.
Если вы хотите, чтобы компилятор помог с этой проблемой (т. е. должно появиться предупреждение), попробуйте с MinGW "-Wall" и "-O2"варианты во время компиляции.Следует предупредить о неинициализированном использовании переменной 'cres'.