2011-07-17 4 views
0


나는 C++로 된 라이브러리를 가지고 있으며 JAVA에서 호출 할 수 있도록 JNI wrapper 함수를 작성하고 있습니다. 나는 많은 다른 기능을 가지고 있지만 특별히 문제가있다.ReleaseStringUTFChars는 free()를 제공합니다 : 0x0841a744 ***

JNIEXPORT void JNICALL Java_com_metcarob_mys_javaapi_a_1SM_1D_1Orginisation_Set_1Name 
    (JNIEnv *p_jEnv, jobject p_jObj, jlong p_nat, jstring invar) { 
SM_D_Orginisation* p_SMD = (SM_D_Orginisation*) p_nat; 
const char *pPp_invar2 = p_jEnv->GetStringUTFChars(invar, NULL); 
if (NULL==pPp_invar2) return; 
std::string *pPp_invar = new std::string(pPp_invar2); 
p_SMD->Set_Name(*pPp_invar); 
    pPp_invar2 = pPp_invar->c_str(); 
    p_jEnv->ReleaseStringUTFChars(invar, pPp_invar2); 
    SAFE_DELETE(pPp_invar); 
    } 

내가에서이 프로그램을 실행할 때 나는 잘못된 포인터 예외를 얻고을 다음과 같이 내가 GetStringUTFChars에와 ReleaseStringUTFChars를 호출 일치 한

void Set_Name(std::string invar) 

: 같은
는 내가 포장하려고 기능은 보인다 자바 :

*** glibc detected *** /home/robert/Oracle/Middleware/jdk160_21/bin/java: free(): invalid pointer: 0x0841a744 *** 
======= Backtrace: ========= 
/lib32/libc.so.6(+0x6b511)[0xf7637511] 
/lib32/libc.so.6(+0x6ce1b)[0xf7638e1b] 
/lib32/libc.so.6(cfree+0x6d)[0xf763bf8d] 
/home/robert/Oracle/Middleware/jdk160_21/jre/lib/i386/client/libjvm.so(+0x34fc8c)[0xf703bc8c] 
/home/robert/Oracle/Middleware/jdk160_21/jre/lib/i386/client/libjvm.so(+0x25139a)[0xf6f3d39a] 
/home/robert/Encrypted/Projects/Scout_Management/smbackend/DEBUG/libjavaapi.so(_ZN7JNIEnv_21ReleaseStringUTFCharsEP8_jstringPKc+0x27)[0xe02475c9] 
/home/robert/Encrypted/Projects/Scout_Management/smbackend/DEBUG/libjavaapi.so(Java_com_metcarob_mys_javaapi_a_1SM_1D_1Orginisation_Set_1Name+0xd8)[0xe0245467] 
[0xf4c0105d] 

내가 ReleaseStringURFCh에 대한 호출을 제거하면 문제없이 작동합니다. 설명서에는 메모리 누수를 방지하기 위해 GetStringUTFChars를 호출 할 때마다 ReleaseStringUTFChars를 호출해야한다고 나와 있습니다.

나는 내가 뭘 잘못하고 있는지, 내가 무엇을 확인해야하는지 잘 모른다.
누구든지 도움을 줄 수 있습니까?
감사
로버트

먼저

const char *pPp_invar2 = p_jEnv->GetStringUTFChars(invar, NULL); 

와 포인터를 취득 그런데 당신이 먼저 먼저 포인터를 다시 할당 메모리를 해제해야합니다

pPp_invar2 = pPp_invar->c_str(); 

로 포인터를 재 할당

답변

2

.

또한 pPp_invarnew으로 할당 한 다음 삭제할 필요가 없습니다. 간단하면 p_SMD->Set_Name(pPp_invar2);이면 충분합니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 그것은 내 문제를 해결했습니다! –

관련 문제