java - 如果 jvm 的参数是从其他类型转换过来的,jni 找不到类

标签 java c++ qt jvm java-native-interface

<分区>

我有一个关于 jni 和 c++/qt 的小问题: 这是我的代码:

void Jvm::create_jvm(QStringList &arguments){
    QTextStream cout(stdout);
    JavaVM *jvm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption *options[4];
    //run begin
    //options[0].optionString = "-Djava.compiler=NONE";
    //options[1].optionString = "-Djava.class.path=app";
    //options[2].optionString = "-verbose:jni";
    //options[3].optionString = "-Xmx512m";
    //run end

    //can't find the class begin
    QByteArray bArray;
    cout<<"Valores del array arguments"<<endl;
    for(int i;i<arguments.size();i++){

        cout<<arguments.at(i)<<endl;
        bArray=arguments.at(i).toStdString().c_str();
        options[i].optionString = bArray.data();
        cout<<options[i].optionString<<endl;
    }
    //can't find the class end


    //jvm args
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 4;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = JNI_FALSE;


    jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    if (res < 0) {//jvm don't created
        qDebug()<<"Can't create Java VM\n";
        exit(1);
    }else{//jvm created
        invoke_class(env);
        jvm->DestroyJavaVM();
    }
}

void Jvm::invoke_class(JNIEnv* env) {
    jclass cls;
    jmethodID mainMethod;
    jobjectArray applicationArgs;
    jstring applicationArg0,applicationArg1,applicationArg2;

    //class and main method
    cls = env->FindClass("HolaMundoSwing");
    if (cls == 0) qDebug()<<"Sorry, I can't find the class"; //In case that class not exist
    mainMethod = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");

    //Application arguments array
    applicationArgs = env->NewObjectArray(3, env->FindClass("java/lang/String"), NULL);
    applicationArg0 = env->NewStringUTF("From");
    applicationArg1 = env->NewStringUTF("C");
    applicationArg2 = env->NewStringUTF("program");

    env->SetObjectArrayElement(applicationArgs, 0, applicationArg0);
    env->SetObjectArrayElement(applicationArgs, 1, applicationArg1);
    env->SetObjectArrayElement(applicationArgs, 2, applicationArg2);

    env->CallStaticVoidMethod(cls, mainMethod, applicationArgs); //Call to the method
}

我测试了参数,都是一样的。 类路径具有相同的值,但注释代码运行正确,其他代码找不到该类,知道吗?

最佳答案

您的 for 循环包含一个错误:

for( int i; i < arguments.size(); i++ )

应该是

for( int i = 0; i < arguments.size(); i++ )

否则 i 将有任何随机起始值(至少对于我的编译器)

关于java - 如果 jvm 的参数是从其他类型转换过来的,jni 找不到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287641/

相关文章:

c++ - 将一个 vector 插入另一个 vector

c++ - 在 Win7 x64 上编译 Qt 应用程序的最简单方法

qt - Qt Fresh Gui应用程序在启动时崩溃,并在QtCore4.dll上出错

java - 如何将 QByteArray 转换为 QString?

java - Activity 间数据绑定(bind)的两种方式

java - Apache InternalHttpClient:确定本地端口号

java - Dropwizard REST API服务器已退出,代码为1

java - 嵌套异常是 java.lang.NoSuchMethodError : javax. ws.rs.ClientErrorException.validate

c++ - c++中的组合错误

c++ - 这个奇数程序有什么问题吗?