2013-04-14 66 views
3

我正試圖從C++調用一個靜態方法到Java。但我得到以下錯誤:需要使用JNI釋放jboolean嗎?

D/cocos2d-x debug info(29160): isInternetConnected Done, value is: 1 
A/libc(29160): @@@ ABORTING: INVALID HEAP ADDRESS IN dlfree 
A/libc(29160): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 

的代碼是:

bool InterfaceJNI::isInternetConnected() 
{ 
    JavaVM* jvm = JniHelper::getJavaVM(); 
    int status; 
    JNIEnv *env; 
    jmethodID mid; 
    jobject jobj; 

    bool isAttached = false; 
    bool returnValue = false; 

    CCLog("InterfaceJNI isInternetConnected"); 

    // Get Status 
    status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6); 

    if(status < 0) 
    { 
     CCLog("isInternetConnected Status < 0 Failed to get JNI Enviroment!!!"); 
     status = jvm->AttachCurrentThread(&env, NULL); 
     CCLog("isInternetConnected Status 2: %d", status); 
     if(status < 0) 
     { 
      CCLog("isInternetConnected Status < 0 !!!"); 
      return false; 
     } 
     isAttached = true; 
     CCLog("isInternetConnected Status isAttached: %d", isAttached); 
    } 

    CCLog("isInternetConnected Status: %d", status); 

    CCLog("isInternetConnected Finding Class...."); 
    jclass mClass = env->FindClass("org/example/SocialNetwork/CCSocialNetwork"); 


    // Get Static bool isInternetConnection() 
    CCLog("isInternetConnected Getting method...."); 
    mid = env->GetStaticMethodID(mClass, "isInternetConnection", "()Z"); 
    if (mid == 0) 
    { 
     CCLog("isInternetConnected FAIL GET METHOD STATIC"); 
     return false; 
    } 
    CCLog("isInternetConnected Calling method...."); 

    // Call Static bool isInternetConnection() 
    jboolean jReturnValue = env->CallStaticBooleanMethod(mClass,mid); 

    CCLog("Call done "); 
    // Convert value from Java to C++ 
    returnValue = (bool)jReturnValue; 
    CCLog("isInternetConnected Done, value is: %d", returnValue); 

    if(isAttached) 
     jvm->DetachCurrentThread(); 

    // Change for return value 
    return returnValue; 
} 

但如果我只是:

// Call Static bool isInternetConnection() 
    /*jboolean jReturnValue =*/ env->CallStaticBooleanMethod(mClass,mid); 

    CCLog("Call done "); 
    // Convert value from Java to C++ 
    //returnValue = (bool)jReturnValue; 
    CCLog("isInternetConnected Done, value is: %d", returnValue); 

    if(isAttached) 
     jvm->DetachCurrentThread(); 

    // Change for return value 
    return returnValue; 

我得到:

Fatal signal 7 (SIGBUS) at 0x00000000 (code=128) 

所以我假設我打電話是好的。

我在C++中,我必須釋放jboolean或另一種方法?

+0

掛上:你得到「致命信號7(SIGBUS)在0x00000000(code = 128)」,並且你認爲該呼叫是好的?那麼你知道致命信號來自哪裏? – TonyK

+0

我認爲你有一些線程問題或內存損壞。我不認爲它與你的Java代碼有關。你能告訴我們如何編譯和鏈接C++代碼嗎? – maba

回答

2

不需要釋放jboolean。

C++代碼沒問題。但是,這個信號7似乎是你的Java代碼有問題。

  • 檢查您是否使用帶靜態調用的靜態類。

如果這是正確的,請檢查您使用的代碼在哪裏。有時候,內部呼叫可以發送SIGBUS,所以儘量只在班上使用代碼。

  • 嘗試一步一步執行您正在執行的代碼來檢查錯誤。
+0

我已經改變了Java代碼,它似乎工作正常。 – vgonisanz