Java程序在从C+调用后提前终止,但没有错误消息+;经由JNI p>所以我有一些java代码,我想通过C++从JNI调用。它由以下代码完成: int main(int argc, char **argv) { JavaVM * jvm; JNIEnv* env = create_vm(&jvm); invoke_class( env ); } JNIEnv* create_vm(JavaVM ** jvm) { JNIEnv* env; JavaVMInitArgs vm_args; JavaVMOption options; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; options.optionString = "-Djava.class.path=<path_to_java_class>:<path_to_jars>"; vm_args.options = &options; vm_args.ignoreUnrecognized = JNI_FALSE; int ret = JNI_CreateJavaVM(jvm, (void **)&env, &vm_args); if(ret < 0) printf("\nUnable to Launch JVM\n"); return env; } void invoke_class(JNIEnv* env) { jclass helloWorldClass; helloWorldClass = env->FindClass("A"); if (env->ExceptionCheck()){ std::cout << "EXCEPTION OCCURED: " << std::endl; env->ExceptionDescribe(); } } call_main(env, helloWorldClass); void call_main(JNIEnv* env, jclass hClass){ jmethodID mainMethod; jobjectArray applicationArgs; jstring applicationArg0; jstring applicationArg1; mainMethod = env->GetStaticMethodID(hClass, "main", "([Ljava/lang/String;)V"); applicationArgs = env->NewObjectArray(2, env->FindClass("java/lang/String"), NULL); applicationArg0 = env->NewStringUTF("planes.txt"); applicationArg1 = env->NewStringUTF("out.txt"); env->SetObjectArrayElement(applicationArgs, 0, applicationArg0); env->SetObjectArrayElement(applicationArgs, 1, applicationArg1); env->CallStaticVoidMethod(hClass, mainMethod, applicationArgs); }

Java程序在从C+调用后提前终止,但没有错误消息+;经由JNI p>所以我有一些java代码,我想通过C++从JNI调用。它由以下代码完成: int main(int argc, char **argv) { JavaVM * jvm; JNIEnv* env = create_vm(&jvm); invoke_class( env ); } JNIEnv* create_vm(JavaVM ** jvm) { JNIEnv* env; JavaVMInitArgs vm_args; JavaVMOption options; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; options.optionString = "-Djava.class.path=<path_to_java_class>:<path_to_jars>"; vm_args.options = &options; vm_args.ignoreUnrecognized = JNI_FALSE; int ret = JNI_CreateJavaVM(jvm, (void **)&env, &vm_args); if(ret < 0) printf("\nUnable to Launch JVM\n"); return env; } void invoke_class(JNIEnv* env) { jclass helloWorldClass; helloWorldClass = env->FindClass("A"); if (env->ExceptionCheck()){ std::cout << "EXCEPTION OCCURED: " << std::endl; env->ExceptionDescribe(); } } call_main(env, helloWorldClass); void call_main(JNIEnv* env, jclass hClass){ jmethodID mainMethod; jobjectArray applicationArgs; jstring applicationArg0; jstring applicationArg1; mainMethod = env->GetStaticMethodID(hClass, "main", "([Ljava/lang/String;)V"); applicationArgs = env->NewObjectArray(2, env->FindClass("java/lang/String"), NULL); applicationArg0 = env->NewStringUTF("planes.txt"); applicationArg1 = env->NewStringUTF("out.txt"); env->SetObjectArrayElement(applicationArgs, 0, applicationArg0); env->SetObjectArrayElement(applicationArgs, 1, applicationArg1); env->CallStaticVoidMethod(hClass, mainMethod, applicationArgs); },java,c++,java-native-interface,Java,C++,Java Native Interface,好的,如果我现在执行C++代码,我会得到以下输出: hi1 如果没有任何错误消息,程序将正确终止。但是,我希望输出类似于: hi1 hi2 Processing took 0ms Normal program end. 似乎调用构造函数根本不会发生,之后的代码根本不会执行 但是,如果我删除该行 private OntModel model = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); 输出是正确的 既

好的,如果我现在执行C++代码,我会得到以下输出:

hi1
如果没有任何错误消息,程序将正确终止。但是,我希望输出类似于:

hi1
hi2
Processing took 0ms
Normal program end.
似乎调用构造函数根本不会发生,之后的代码根本不会执行

但是,如果我删除该行

private OntModel model = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC);
输出是正确的

既然不考虑这一点,这里发生了什么?即使程序根本不应该完成,但它怎么可能在没有错误消息的情况下终止呢

我试着输入类似于
Thread.sleep(10000)
的东西,看看它是否与给定调用所花费的时间有关,但这似乎根本不是问题

编辑:sry,我忘了更改类名。
EDIT2:我应该提到,当java代码没有从C++环境中调用时,它运行得非常好。它与jar文件和一些文件位置有关。对不起,无故打扰了

java代码甚至没有编译…对不起,我忘了更改类名。类中还有导入,这是不允许的。你能不能发布一个完整的工作示例?控件返回到C++代码吗?也就是说,如果你把一些
cout-yes放进去,输出就会显示出来——我认为这与jar文件有关。。如果我将
options.optionString=“-Djava.class.path=:”
放在一个.sh文件中并运行它,程序将完全按照我的要求运行。。如果C++调用java代码,有没有办法得到JVM错误消息?
private OntModel model = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC);