2

ネイティブ バッファを作成し、そこにデータを読み書きして JNI ブリッジ経由で通信する SDK/NDK ベースのアプリがあります。4.4 (DALVIK) では正常に機能します - または、少なくとも例外をスローしていませんでした。ART が必須になると、つまり Lollipop では、アプリの終了/終了時に失敗するようになりました。ここで直接バッファを作成します。

JNIEXPORT void JNICALL Java_com_class_nativeOnDirect(JNIEnv* jenv,   jobject obj, jobject   m, jobject mv){
  GLubyte* _dData;
_dData = (GLubyte*)jenv->GetDirectBufferAddress(m);
}

直接データの消去:

 JNIEXPORT void JNICALL Java_com_class_nativeOnFreeNativeBuffer(JNIEnv* jenv, jobject obj, jobject m){
 jenv->DeleteGlobalRef(m);
}   

これについていくつかの調査を行った後、なぜこれが起こるのかはまだはっきりしていません。ところで-「DeleteGlobalref(jobjct)が発生しない場合-例外はスローされません。ここでメモリリークが発生することを恐れています。よろしくお願いします

4

1 に答える 1

3

DeleteGlobalRefローカル ref を呼び出すべきではありません。jobject返された実際のポインターのみを呼び出しますNewGlobalRef。したがって、この場合、 を呼び出していない限り、どちらもNewGlobalRef呼び出す必要はありませんDeleteGlobalRef

NewGlobalRefJNI 関数呼び出しが返された後に使用するために、オブジェクトへの参照をネイティブ側に格納する場合にのみ使用する必要があります。

JNI API を正しく使用する場合、ART は dalvik よりも少し厳密であるため、コードは最初から間違っていましたが、エラーは発生していません。CheckJNI を有効にしてより厳密なチェックを行う方法のヒントについては、http://android-developers.blogspot.fi/2011/07/debugging-android-jni-with-checkjni.html を参照して、このような問題を早期に発見できるようにしてください

于 2014-11-24T20:13:14.503 に答える