Jni java启动器在c中工作,但不在c++中

Posted

技术标签:

【中文标题】Jni java启动器在c中工作,但不在c++中【英文标题】:Jni java launcher work in c but not in c++ 【发布时间】:2013-09-09 13:48:57 【问题描述】:

我必须编写一个用 C++ 启动 Java 应用程序的程序。

C 中的第一个示例运行良好,它在 C 中完美地启动了 jar。但是当我在 C++ 中运行相同的进程时,我得到了一个异常。

这是 C 代码:

SetCurrentDirectoryA("..\\myJavaApp\\");
JavaVMInitArgs args;
int optionsLength = 4;
JavaVMOption options[optionsLength];
options[0].optionString = "-Djava.class.path=path\\myJar.jar";

options[1].optionString = "-Xbootclasspath/p:.\\lib\\BootJar.jar";
options[2].optionString = "-Djava.protocol.handler.pkgs=com.protocol";
options[3].optionString = "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000";
args.options = options;
args.ignoreUnrecognized = JNI_FALSE;
int ret = JNI_CreateJavaVM(&jvm, (void **) &env, &args);
if (ret < 0) 
    printf("\nUnable to Launch JVM %d ", ret);
 else 
    printf("\nJVM launched successfully");

UncaughtExceptionClass = (*env)->FindClass(env, "mypackage/MyMainClass");
 if (UncaughtExceptionClass == NULL) 
    printf("\nClass not found.");
    (*jvm)->DetachCurrentThread(jvm);
    return;


mainMethod = (*env)->GetStaticMethodID(env, UncaughtExceptionClass, "main", "([Ljava/lang/String;)V");
if (mainMethod == NULL) 
    printf("\nMethod not found.");
    (*jvm)->DetachCurrentThread(jvm);
    return;


(*env)->CallStaticVoidMethod(env, UncaughtExceptionClass, mainMethod, NULL);

(*jvm)->DetachCurrentThread(jvm);

在 C++ 中:

SetCurrentDirectoryA(cmdval.c_str());
JavaVMInitArgs args;
JavaVMOption options[5];
std::cout << " number of argument " << nbargs << std::endl;

args.version = JNI_VERSION_1_6;
args.nOptions = 5;
options[0].optionString = (char*) "-Djava.class.path=path\\myJar.jar";


options[1].optionString = (char*) "-Xbootclasspath/p:.\\lib\\BootJar.jar";
options[2].optionString = (char*) "-Djava.protocol.handler.pkgs=com.protocol";
options[3].optionString = (char*) "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000";
options[4].optionString = "-verbose:jni";

args.options = options;
args.ignoreUnrecognized = JNI_FALSE;
int ret = JNI_CreateJavaVM(&jvm, (void **) &env, &args);
if (ret < 0)

    //        printf("\nUnable to Launch JVM %d ", ret);

else

    printf("\nJVM launched successfully\n");
 
attachThread = (*jvm).AttachCurrentThread((void**) &env, NULL);

jclass mainClass =(*env).FindClass("mypackage/MyMainClass");

这是我在 C++ 中遇到的异常:

Exception in thread "main" java.lang.NoClassDefFoundError: mypackage/MyMainClass
Caused by: java.lang.ClassNotFoundException: mypackage.MyMainClass
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)

如果我做错了什么,谁能告诉我?

【问题讨论】:

您似乎在 -Djava.class.path=... 中有错字... 我编辑它是一个复制错误 【参考方案1】:

您需要将(*env) 替换为env,并从括号的开头删除env。例如替换:

FindClass(env, "mypackage/MyMainClass");

与:

FindClass("mypackage/MyMainClass");

【讨论】:

以上是关于Jni java启动器在c中工作,但不在c++中的主要内容,如果未能解决你的问题,请参考以下文章

Qt。所有功能都在发布文件夹中工作,但不在 Program Files 中

Erlang:函数在 shell 中工作,但不在 YAWS 中

SSE 2005 存储过程在管理工作室中工作,但不在 C# DAL 中

RESTful Web 服务在 localhost 服务器中工作,但不在生产服务器中

获取在 HTML 页面中工作但不在 JS 中工作 [重复]

请求在CURL中工作但不在Ajax中工作