C++ 用jni展示hello world swing

C++ 用jni展示hello world swing,c++,swing,qt,java-native-interface,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

这是我的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.
#包括
#包括
int main(int argc,char*argv[]){
JavaVM*jvm;
JNIEnv*env;
jstring-jstr;
jobjectArray参数;
jclass stringClass;
JavaVMInitArgs vm_args;
JavaVMOption选项[3];
选项[0]。选项字符串=“-Djava.compiler=NONE”;
选项[1]。选项字符串=“-Djava.classpath=”;
选项[2]。选项字符串=”;
vm_args.version=JNI_version_1_6;
vm_args.nOptions=3;
vm_args.options=选项;
vm_args.ignoreunrecogned=JNI_TRUE;
jint res=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
如果(res<0){
qDebug()FindClass(“java/lang/String”);
args=env->NewObjectArray(1,stringClass,jstr);
env->CallStaticVoidMethod(cls,get\u main\u id,args);
jvm->javavm();

qDebug()在虚拟机有机会显示UI之前,您正在销毁虚拟机

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


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

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

在销毁jvm之前,我尝试添加一个sleep函数,我使用以下代码:
env->CallStaticVoidMethod(cls,get_main_id,args);I::sleep(5);jvm->destrouchJavaVM()
在销毁jvm之前等待五秒钟,但不要显示ui。您在哪个平台上?不同的平台在线程和启动事件调度线程方面可能有不同的要求。例如,在Mac OS X上。