这是我的main.cpp代码:
#include <jni.h>
#include <QDebug>
int main(int argc, char *argv[]) {
JavaVM *jvm;
JNIEnv *env;
jstring jstr;
jobjectArray args;
jclass stringClass;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.classpath=.";
options[2].optionString = "";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res < 0) {
qDebug()<<"Can't create Java VM\n";
exit(1);
};
jclass cls = env->FindClass("HelloWorldSwing");
if (cls == 0) qDebug()<<"Sorry, I can't find the class";
jmethodID get_main_id =
env->GetStaticMethodID(cls,"main","([Ljava/lang/String;)V");
jstr=env->NewStringUTF("hola que tal");
stringClass=env->FindClass("java/lang/String");
args=env->NewObjectArray(1,stringClass,jstr);
env->CallStaticVoidMethod(cls,get_main_id,args);
jvm->DestroyJavaVM();
qDebug()<<"Java VM destroy\n";
}//end main.
HelloWorldSwing是一个显示带有“Hello world”文本的jframe的类,但如果我在java类中编写system.out.println(“hello world”),则不显示任何内容,正常运行。
答案 0 :(得分:1)
在有机会显示用户界面之前,您正在销毁虚拟机。
对System.out.println的调用是同步的,因此在销毁VM之前就会发生这种情况。
创建UI涉及在单独的线程上创建和分派事件。如果您在销毁VM之前只是暂停几秒钟,我想您会看到您的UI显示出来。
答案 1 :(得分:0)
问题出在java的主要类中。
JNI调用main方法,当这一结束时,程序结束。我只是在main方法中放了一个guithread.join ();
,并且都运行正确。