2013-12-23 2 views
0

Я подножка на follwing C++ код и значение «РЭТ» -1 (создавание из JavaVM является falid)запустить банку файл из C++

, что это проблема с кодом?

#include <iostream> 
#include <conio.h> 
#include <jni.h> 
using namespace std; 
#pragma comment (lib,"jvm.lib"); 

int main(){ 
JavaVM *jvm; 
JNIEnv *env; 
JavaVMInitArgs vm_args; 
JavaVMOption options; 

options.optionString="hello.jar"; 
vm_args.version=JNI_VERSION_1_6; 
vm_args.nOptions=1; 
vm_args.Option=&options; 
vm_args.ignoreUnrecognized=0; 
int ret=JNI_CreatJavaVM(&jvm,(void**)&env,&vm_args); 

} 

Thats за помощь

+0

Это не является допустимым вариантом для инициализации VM - Вы хотите что-то вроде '-Djava.class.path = hello.jar' вместо; и инициализация виртуальной машины ** фактически не запускает основной класс - вам придется сделать это самостоятельно. – Petesh

+0

Он по-прежнему возвращает re-1 – user3130432

+0

Запрет на использование параметра невозможен, есть несколько причин, по которым он не мог запустить виртуальную машину - возможно, он не смог загрузить 'jvm.dll'. Вы пытались запустить код, наблюдая за приложением с помощью filemon/regmon? – Petesh

ответ

1

Если вы передаете в недопустимой опции к CreateJavaVM вызову, из-за ignoreUnrecognized = 1 он будет не в состоянии запустить JVM.

Когда я создаю простую банку со статическим недействительным основным способом общественным и использовать следующий код, он правильно вызывает основной метод:

JavaVM *jvm; 
JNIEnv *env; 
JavaVMInitArgs vm_args; 
JavaVMOption options; 
options.optionString = "-Djava.class.path=hello.jar"; 
vm_args.version = JNI_VERSION_1_6; 
vm_args.nOptions = 1; 
vm_args.options = &options; 
vm_args.ignoreUnrecognized = 0; 
int ret = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 
if (ret == 0) { 
    jclass cls = env->FindClass("hello"); 
    if (cls != 0) { 
     jmethodID meth = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); 
     jarray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), 0); 
     env->CallStaticVoidMethod(cls, meth, args); 
    } 
} 
return ret; 

Это предполагает, что hello.jar находится в рабочем каталоге исполняемого , Если это не так, вам нужно указать полный путь к файлу jar. например c:\hello.jar.

+0

Как насчет загрузки jvm.dll? – user3130432

+0

Если 'jvm.dll' не загружается, приложение даже не запустится (я думал о ситуации, когда DLL загружена с задержкой, что не является значением по умолчанию). Ваш исходный код просто не работает, поскольку вы используете недопустимый параметр. – Petesh

0

Я написал следующий код сейчас:

#include "stdafx.h" 
#include <iostream> 
#include "jni.h" 
#include <conio.h> 
using namespace std; 

#pragma comment (lib,"jvm.lib") 

int main() 

    { 
JavaVM *jvm; 
JNIEnv *env; 
JavaVMInitArgs vm_args; 
JavaVMOption options; 

options.optionString="-Djava.class.path=hello.jar"; 
vm_args.version=JNI_VERSION_1_6; 
vm_args.options=&options; 
vm_args.ignoreUnrecognized=0; 
int ret=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); 


    } 

и это записано мне follwing erore, когда я пытаюсь запустить:

Ошибка 1 ошибка LNK2019: неразрешенный внешний символ _ имп _JNI_CreateJavaVM @ 12, на которые ссылается функция _main C: \ Users \ Hilla \ Documents \ Visual Studio 2012 \ helloworld \ helloworld \ helloworld.obj helloworld

jvm.lim и j vm.dll находятся в рабочем каталоге

спасибо за помощь

Смежные вопросы