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

UIを表示する前に、VMを破棄しています。

System.out.printlnの呼び出しは同期的であるため、VMを破棄する前に行われます。

UIの作成には、別のスレッドでのイベントの作成とディスパッチが含まれます。VMを破棄する前に数秒間一時停止するだけの場合は、UIが表示されると思います。

于 2012-08-17T14:54:06.273 に答える
0

問題はJavaのメインクラスにありました。JNIはmainメソッドを呼び出し、これが終了するとプログラムが終了します。mainメソッドにを入れるだけguithread.join ();で、すべて正しく実行されます。

于 2012-08-21T10:21:59.317 に答える