запустить файл JAR из C ++

0

Я запускаю следующий код c++, а значение "ret" - -1 (создание javavm неверно)

в чем проблема с кодом?

#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);

 }

это для помощи

  • 0
    Это недопустимая опция для инициализации виртуальной машины - вы хотите что-то вроде -Djava.class.path=hello.jar ; и инициализация виртуальной машины фактически не запускает основной класс - вам придется сделать это самостоятельно.
  • 0
    Это все еще возвращает ре -1
Показать ещё 2 комментария
Теги:
jar

2 ответа

1

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

Когда я создаю простой банку с открытым статическим методом void 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.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?
  • 0
    Если jvm.dll не загружается, то приложение даже не запустится (я думал о ситуации, когда dll загружается с задержкой, что не является значением по умолчанию). Ваш исходный код просто не будет работать, так как вы используете неверную опцию.
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);


     }

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню