2

这是我的 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"),则可以正常运行。

4

2 回答 2

1

您在 VM 有机会显示 UI 之前将其销毁。

对 System.out.println 的调用是同步的,因此它发生在您销毁 VM 之前。

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

于 2012-08-17T14:54:06.273 回答
0

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

于 2012-08-21T10:21:59.317 回答