与jni一起展示hello world swing

show hello world swing with jni

本文关键字:hello world swing jni 一起      更新时间:2023-10-16

这是我的主.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 VMn";
        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 destroyn";
}//end main.

HelloWorldSwing是一个类,它显示一个带有"Hello-world"文本的jframe,但不显示任何内容,如果我在java类中编写system.out.println("helloworld"),则函数正确。

在VM有机会显示UI之前,您正在破坏它。

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

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

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