【问题标题】:run jar file from c++从 C++ 运行 jar 文件
【发布时间】:2013-12-23 18:29:13
【问题描述】:

我正在运行以下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);

 }

这就是帮助

【问题讨论】:

  • 这不是初始化 VM 的有效选项 - 您需要类似 -Djava.class.path=hello.jar 的东西;并且初始化一个虚拟机并没有真正启动一个主类——你必须自己做。
  • 它仍然返回re -1
  • 除非选项不好,否则它无法启动 VM 有几个原因 - 也许它无法加载 jvm.dll。您是否尝试过在使用 filemon/regmon 观察应用的同时运行代码?
  • No 我如何检查 jvm.dll 是否被加载?我正在使用 Visual Studio 的调试器

标签: java c++ jar


【解决方案1】:

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

当我使用公共静态 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.

【讨论】:

  • jvm.dll 加载情况如何?
  • 如果jvm.dll 没有加载,那么应用程序甚至都不会启动(我在想dll延迟加载的情况,这不是默认的)。您的初始代码根本无法工作,因为您使用了无效选项。
【解决方案2】:

我现在写下一段代码:

#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 中引用你好世界

jvm.lim 和 jvm.dll 在工作目录中

感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 2012-09-13
    • 2016-03-03
    • 2018-02-18
    • 1970-01-01
    • 2018-12-13
    • 2020-09-14
    • 2013-03-09
    相关资源
    最近更新 更多