0

jobject呼び出されたときに Java に戻る JNI メソッドを実装する C コードがいくつかあります。C コードでは、struct次のような a を少しいじっています。

typedef struct {
    char* something
    int somethingElse
} awesomeStruct;

C ライブラリではmalloc、構造体とchar*.

JNI メソッドの最後でを返す場合はjobject、次のようにします。

awesomeStruct *mystruct = getResult();
jstring somethingString;
jint somethingElseInt;

somethingString = (*env)->NewStringUTF(env,mystruct->something);
somethingElseInt = mystruct->somethingElse;

ret = (*env)->NewObject(env,javaClass,method,somethingString, somethingElseInt);

return ret;

うまくいけば、これは、構造体にあった文字列と int の 2 つのパラメーターを使用してmethodメソッド onを呼び出す必要があります。javaClass

getResult()struct と char 配列に対してaを行うとすれば、mallocこれを解放するにはどうすればよいですか? return ステートメントのいずれかmystructまたはその前に解放しようとすると、エラーが発生します。これは、return オブジェクトに、free を呼び出すと存在しなくなったものへの参照が含まれているためだと思います。mystruct->somethingDebug assertion Failed - CrtlsValidHeapPointer

この漏れを止めるにはどうすればよいですか?

4

1 に答える 1

0

C側のJNIメモリリークで同様の問題がありました。割り当てられた文字列がありました(UTF Char配列はメモリに残りました)。JNIメモリ解放コマンドで解決しました。

(*env)->ReleaseStringUTFChars(env,jmessage,message);

それは本当に私の問題を解決してくれるので、この Web サイトのこのドキュメントを見れば、解決策になるかもしれません。

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

于 2016-01-28T23:34:06.883 に答える