2012-12-06 3 views
2

내 C++ 클래스에서 페이스 북 로그인을 구현하려고합니다. 자바에서 나는 사용자의 페이스 북 정보를 얻으려고 노력하고있다. 모든 것이 Java에서 C++로 올바르게 전달됩니다. 이 코드 조각이 주석 때내 C++ JNI에서 충돌을 일으키는 원인은 무엇입니까?

그러나, (여기에 다른 유사한 답변에 따라 메모리 문제) 신호 (11) 내 응용 프로그램 충돌이 개 라인 아래

JNIEXPORT void JNICALL Java_com_humit_android_HumIt_javaCallJNI(JNIEnv* env, jobject obj, 
             jstring javaString1, jstring javaString2, jstring javaString3) 
{ 
    //Get the native string from javaString 
    const char *nativeString1 = env->GetStringUTFChars(javaString1, 0); 
    const char *nativeString2 = env->GetStringUTFChars(javaString2, 0); 
    const char *nativeString3 = env->GetStringUTFChars(javaString3, 0); 

// 오류를주고있다. .. 만약 코멘트, 아무 문제 ...!

LoginScreen * loginScreen = new LoginScreen(); 
    loginScreen->facebookProfileInfoFetch("hi", "hii", "hii"); 




    env->ReleaseStringUTFChars(javaString1, nativeString1); 
    env->ReleaseStringUTFChars(javaString2, nativeString2); 
    env->ReleaseStringUTFChars(javaString3, nativeString3); 

} 

facebookProfileInfoFetch은 다음과 같습니다

void LoginScreen::facebookProfileInfoFetch(const char * value1, const char * value2, const char * value3) { 
LOGD(" ----------------- facebookProfileInfoFetch ------------- %s ------------ ", value1); 
LOGD(" ----------------- facebookProfileInfoFetch ------------- %s ------------ ", value2); 
LOGD(" ----------------- facebookProfileInfoFetch ------------- %s ------------ ", value3); 

facebookUserName = value1; 
facebookUserId = value2; 
facebookUserGender = value3; 

this->loginHumServer(); 

} 

loginHumServer()가 호출 될 때 충돌되는 :

loginhumserver는()입니다 :

void LoginScreen::loginHumServer() 
{ 
LOGD(" ----------------- loginHumServer ------------------------- "); 
facebookDataRetrievedCount++; 

if(facebookDataRetrievedCount<2) 
    return; 


CCHttpRequest* request = new CCHttpRequest(); 
LOGD(" ----------------- constructing url ------------------------- "); 
std::string url="http://humsrer.co.in/user/sign_in?"; 
url=url+"name"+"="+facebookNoSpaceUserName+"&"; 
url=url+"facebook_thumbnail"+"="+facebookUserPictureUrl+"&"; 
url=url+"facebook_id"+"="+facebookUserId+"&"; 
url=url+"gender"+"="+facebookUserGender+"&"; 
url=url+"ios_push_id"+"="+"12346"; 

CCLog("UUUUUUUUUUUUUUUUUUU %s ",url.c_str()); 
request->setUrl(url.c_str()); 
request->setRequestType(CCHttpRequest::kHttpGet); 
request->setResponseCallback(this, callfuncND_selector(LoginScreen::onHttpRequestCompleted)); 
// optional fields 
request->setTag("GET test2"); 
LOGD(" ----------------- loginHumServer getInstance ------------------------- "); 
CCHttpClient::getInstance()->send(request); 

// don't forget to release it, pair to new 
request->release(); 
LOGD(" ----------------- loginHumServer request->release ------------------------- "); 
loginLabel->setString("Loging to hum server.."); 
} 

이는 로그 캣입니다 앱 충돌시 발생하는 오류 :

12-06 13:49:45.380: INFO/DEBUG(5637): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad 
12-06 13:49:45.380: INFO/DEBUG(5637): r0 deadbaad r1 01ddc9e8 r2 40000000 r3 00000000 
12-06 13:49:45.380: INFO/DEBUG(5637): r4 00000000 r5 00000027 r6 00000000 r7 57797f3c 
12-06 13:49:45.380: INFO/DEBUG(5637): r8 5c6d9c10 r9 57797f34 10 00000008 fp 5c6d9c24 
12-06 13:49:45.380: INFO/DEBUG(5637): ip ffffffff sp 5c6d9a90 lr 400ff649 pc 400fb9d8 cpsr 60000030 
12-06 13:49:45.380: INFO/DEBUG(5637): d0 4448000044480000 d1 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d2 449a0000449a0000 d3 000004d0c41a0000 
12-06 13:49:45.380: INFO/DEBUG(5637): d4 3f8000004b7fffff d5 449a000044480000 
12-06 13:49:45.380: INFO/DEBUG(5637): d6 4499e0004447c000 d7 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d8 0000000000000000 d9 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d10 0000000000000000 d11 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d12 0000000000000000 d13 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d14 0000000000000000 d15 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d16 5000000000000000 d17 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d18 0000000000000000 d19 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d20 0000000000000000 d21 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d22 0000000000000000 d23 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d24 0000000000000000 d25 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d26 0000000000000000 d27 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d28 0000000000000000 d29 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): d30 0000000000000000 d31 0000000000000000 
12-06 13:49:45.380: INFO/DEBUG(5637): scr 60000010 
12-06 13:49:45.650: INFO/DEBUG(5637):   #00 pc 000179d8 /system/lib/libc.so 
12-06 13:49:45.650: INFO/DEBUG(5637):   #01 pc 0001ef44 /system/lib/libc.so (__assert2) 
12-06 13:49:45.650: INFO/DEBUG(5637):   #02 pc 000fb552 /data/data/com.humit/lib/libgame.so (_ZN11LoginScreen22onHttpRequestCompletedEPN7cocos2d6CCNodeEPv) 
12-06 13:49:45.655: INFO/DEBUG(5637):   #03 pc 001c3e32 /data/data/com.humit/lib/libgame.so (_ZN7cocos2d9extension12CCHttpClient25dispatchResponseCallbacksEf) 
12-06 13:49:45.655: INFO/DEBUG(5637):   #04 pc 000ff9aa /data/data/com.humit/lib/libgame.so (_ZN7cocos2d7CCTimer6updateEf) 
12-06 13:49:45.655: INFO/DEBUG(5637):   #05 pc 001053d6 /data/data/com.humit/lib/libgame.so (_ZN7cocos2d11CCScheduler6updateEf) 
12-06 13:49:45.655: INFO/DEBUG(5637):   #06 pc 0012f7f8 /data/data/com.humit/lib/libgame.so (_ZN7cocos2d10CCDirector9drawSceneEv) 
12-06 13:49:45.660: INFO/DEBUG(5637):   #07 pc 00130df8 /data/data/com.humit/lib/libgame.so (_ZN7cocos2d21CCDisplayLinkDirector8mainLoopEv) 
12-06 13:49:45.660: INFO/DEBUG(5637):   #08 pc 0016c66c /data/data/com.humit/lib/libgame.so (Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender) 
12-06 13:49:45.660: INFO/DEBUG(5637):   #09 pc 0001ed70 /system/lib/libdvm.so (dvmPlatformInvoke) 
12-06 13:49:45.660: INFO/DEBUG(5637):   #10 pc 0005902c /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread) 

왜 충돌하는지 디버깅 할 수 없습니다. 친절하게 도와주세요.

void LoginScreen::onHttpRequestCompleted(CCNode *sender, void *data) 
{ 
    LOGD(" ----------------- LoginScreen onHttpRequestCompleted ------------------------- "); 
    CCLOG("request completed"); 

    CCHttpResponse *response = (CCHttpResponse*)data; 

    if (!response) 
    { 
     LOGD(" ----------------- LoginScreen onHttpRequestCompleted return ------------------------- "); 
     return; 
    } 

    // You can get original request type from: response->request->reqType 
    if (0 != strlen(response->getHttpRequest()->getTag())) 
    { 
     CCLog("%s completed", response->getHttpRequest()->getTag()); 
    } 

    int statusCode = response->getResponseCode(); 
    char statusString[64] = {}; 
    sprintf(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag()); 
    //m_labelStatusCode->setString(statusString); 
    CCLog("response code: %d", statusCode); 

    if (!response->isSucceed()) 
    { 
     CCLog(" %s response failed", response->getResponseData()); 
     CCLog("error buffer: %s", response->getErrorBuffer()); 
     LOGD(" ----------------- LoginScreen onHttpRequestCompleted response failed ------------------------- "); 
     return; 
    } 

    //dump data 
    std::vector<char> *buffer = response->getResponseData(); 

    char * charbuffer = new char[buffer->size()]; 

    printf("Http Test, dump data: "); 

    unsigned int size=0; 
    for (unsigned int i = 0; i < buffer->size(); i++) 
    { 
     charbuffer[i] = (*buffer)[i]; 
     size=i+1; 
    } 

    charbuffer[size] = 0; 

    char *errorPos = 0; 
    char *errorDesc = 0; 
    int errorLine = 0; 
    block_allocator allocator(1 << 10); // 1 KB per block 

    json_value *root = json_parse(charbuffer, &errorPos, &errorDesc, &errorLine, &allocator); 

    root = root->first_child; 

    assert(root->type ==JSON_STRING); 

    assert(std::string(root->name) == "user_id"); 

    loginLabel->setString("Loading active games.."); 
    GameManager::create(root->json_value::string_value,facebookUserId.c_str(),facebookUserName.c_str()); 

// GameManager::create("b37e329c-37ac-11e2-abf1-1231381a9805"); 

    delete[] charbuffer; 

    this->next(); 

} 
+0

자바가 없으면 어떻게 될까요? C++에서 동일한 매개 변수를 사용하여 호출하면 C++ 함수가 제대로 작동합니까? –

+0

@MinLin 감사합니다,하지만 나에게 같은 오류를주고있다 : ( – pixelscreen

답변

0

당신은 잘못된 위치를 가리키는 곳의 포인터를 가지고 :

편집 나는 onHttpRequestCompleted 방법을 추가했습니다. 이것이 세분화 오류의 원인입니다. 크래시가 LoginScreen::onHttpRequestCompleted에서 시작되는 것 같습니다. 게시 할 수 있습니까?

+0

그 방법을 추가, 내 편집 참조하십시오. – pixelscreen

+0

/data/data/com.humit/lib/libgame.so에 000fb552에 대한 addr2line을 실행할 수 있습니까? 이 문제가 delete []에 의해 발생되었다고 느낄 수도 있습니다. 또한 char 배열을 수동으로 복사 할 필요가 없습니다. char * charbuffer = & (* buffer) [0]'과) 그렇게하면 삭제를 삭제할 수 있습니다. –

+0

@llya O - ok i wl 시도해보십시오 ... 문제가 발생하면 주석을 제거 할 때만 해당합니까? 그 선들이 논평하는 동안 안돼? 만약 내가 그 두 줄을 언급하면 ​​다른 모든 것들이 잘 작동한다 ... – Braj

1

assert()가 실행 중입니다. 당신은 매우 구체적인 주소에 실패하고 있습니다 :

INFO/DEBUG(5637): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad 

0xdeadbaad는 생체 공학 중단() 함수에 의해 사용됩니다. (모든 사람이 좋아 - http://code.google.com/p/android/issues/detail?id=16672를 참조하십시오.) 당신이 실패하는 경우

스택 추적을 설명 : 정의

INFO/DEBUG(5637):   #00 pc 000179d8 /system/lib/libc.so 
INFO/DEBUG(5637):   #01 pc 0001ef44 /system/lib/libc.so (__assert2) 
INFO/DEBUG(5637):   #02 pc 000fb552 /data/data/com.humit/lib/libgame.so (_ZN11LoginScreen22onHttpRequestCompletedEPN7cocos2d6CCNodeEPv) 
INFO/DEBUG(5637):   #03 pc 001c3e32 /data/data/com.humit/lib/libgame.so (_ZN7cocos2d9extension12CCHttpClient25dispatchResponseCallbacksEf) 

__assert2, 생체 공학의 < > assert.h를.

LoginScreen::onHttpRequestCompleted(cocos2d::CCNode*, void*)에서 호출됩니다. 라이브러리의 심볼과 함께 주소 - 행 도구를 사용하여 특정 행 번호로 변환 할 수 있지만 실패한 주장 자체는 네이티브 충돌 바로 위에있는 logcat에 표시되는 것이 이상적입니다.

관련 문제