main的JNI CallStaticVoidMethod没有返回到c++

JNI CallStaticVoidMethod for main does not return to c++

本文关键字:返回 c++ JNI CallStaticVoidMethod main      更新时间:2023-10-16

可能重复:
如何在从JNI 调用的代码中捕获System.exit()

调用后的JNI CallStaticVoidMethod正确启动了Java进程,但没有返回到C++代码,之后它就退出了。我的java code没有system.exit(0),但它只有return;

jclass StringClass = m_JVMEnv->FindClass("java/lang/String");
    int numOfArguments = (int)m_ServerArguments.size() + 4 ;
    int argumentIndex = 0;
    jobjectArray jargs = m_JVMEnv->NewObjectArray(numOfArguments, StringClass, NULL);    
    m_JVMEnv->SetObjectArrayElement(jargs, argumentIndex++, m_JVMEnv->NewStringUTF("start"));
    std::string strJavaClassPath = "-classpath=";
    strJavaClassPath             += """;
    for ( std::size_t idx = 0; idx < m_listOfJars.size() - 1 ; idx++) {
        strJavaClassPath += m_ProductLibDir + "\lib\" + m_listOfJars[idx] + ";";
    }
    strJavaClassPath      += m_ProductLibDir + "\lib\" + m_listOfJars[m_listOfJars.size() - 1] ;
    strJavaClassPath      += """;
    m_JVMEnv->SetObjectArrayElement(jargs, argumentIndex++, m_JVMEnv->NewStringUTF(strJavaClassPath.c_str()));
    for ( std::vector<std::string>::iterator iter = m_ServerArguments.begin(); iter != m_ServerArguments.end(); ++iter) {
        std::string argument = *iter;
        m_JVMEnv->SetObjectArrayElement(jargs, argumentIndex++, m_JVMEnv->NewStringUTF(argument.c_str()));
    }
    m_JVMEnv->SetObjectArrayElement(jargs, argumentIndex, m_JVMEnv->NewStringUTF("-dir=E:\Avinash\personal\work\CreateJvm\Debug"));    
    m_JVMEnv->CallStaticVoidMethod(m_CacheServerLauncherClass, m_MainMethodID, jargs);
    std::cout << "I am done with launching java program" << std::endl;
    m_RunningJVMInstance->DestroyJavaVM();
    CheckForJNIException();

m_JVMEnv->CallStaticVoidMethod(m_CacheServerLauncherClass, m_MainMethodID, jargs);之后该行程序控制不返回。

您的Java代码需要一个线程来运行,如果您想为C++代码创建另一个线程,则必须创建一个线程。