从c ++运行jar文件

时间:2013-12-23 18:29:13

标签: java c++ jar

我正在运行以下c ++代码,“ret”的值为-1(java vm的创建有效)

代码有什么问题?

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

 }

那是帮助

2 个答案:

答案 0 :(得分:1)

如果您向CreateJavaVM调用传递了无效选项,由于ignoreUnrecognized = 1它将无法启动JVM。

当我使用public static void main方法创建一个简单的jar,并使用以下代码时,它正确调用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

答案 1 :(得分: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:函数_main C:\ Users \ Hilla \ Documents \ Visual Studio 2012 \ helloworld \ helloworld \ helloworld.obj中引用了未解析的外部符号_ imp _JNI_CreateJavaVM @ 12的HelloWorld

jvm.lim和jvm.dll位于工作目录

感谢您的帮助