用jni向你展示你好的世界摇摆

时间:2012-08-17 12:54:41

标签: c++ swing qt java-native-interface

这是我的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”),则不显示任何内容,正常运行。

2 个答案:

答案 0 :(得分:1)

在有机会显示用户界面之前,您正在销毁虚拟机。

对System.out.println的调用是同步的,因此在销毁VM之前就会发生这种情况。

创建UI涉及在单独的线程上创建和分派事件。如果您在销毁VM之前只是暂停几秒钟,我想您会看到您的UI显示出来。

答案 1 :(得分:0)

问题出在java的主要类中。 JNI调用main方法,当这一结束时,程序结束。我只是在main方法中放了一个guithread.join ();,并且都运行正确。