2012-07-09 35 views
-3

可能重複:
How to trap System.exit() in code called from JNIJNI CallStaticVoidMethod主不會返回到C++

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);此行程序控制不返回後。

+0

發佈一些代碼,我們可以看看會很有幫助。沒有它,我們可以建議的不多。 – 2012-07-09 11:41:01

+4

不知何故,這轉化爲我「我稱爲一個函數,並且一個叫退出(0),我想知道爲什麼該功能不會返回」 – PlasmaHH 2012-07-09 11:47:11

+0

我的java代碼是服務器,我只是想啓動,然後與它溝通。 – Avinash 2012-07-09 12:15:45

回答

1

你的Java代碼將需要一個線程來運行,如果你想爲你的C++代碼另一個線程,你將不得不創建一個。