2011-07-17 11 views
0


私はCでライブラリを持っ++と私は、私はJAVAからそれを呼び出すことができるように、JNIのラッパー関数を書いています。私はさまざまな機能が働いていますが、特に問題があります。
のように、私はルックスをラップしようとしています機能:次のように私はGetStringUTFCharsとReleaseStringUTFCharsへの呼び出しを一致している
ReleaseStringUTFCharsは無料()を与え0x0841a744 ***

void Set_Name(std::string invar) 

:私はからこれを実行すると

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); 
    } 

私は、無効なポインタ例外を取得していますJava:

*** 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

こんにちは、お返事ありがとうございます。それは私の問題を解決しました! –