2016-10-22 4 views
1

私はアンドロイド-21でビットマップの方法recycle()のソースコードをチェックして、私はこれを見た:nativeRecycle()メソッドで "ネイティブピクセルオブジェクト"がまだネイティブレベルで使用されている場合は、

public void recycle() { 
    if (!mRecycled) { 
    if (nativeRecycle(mNativeBitmap)) { 
     // return value indicates whether native pixel object was actually recycled. 
     // false indicates that it is still in use at the native level and these 
     // objects should not be collected now. They will be collected later when the 
     // Bitmap itself is collected. 
     mBuffer = null; 
     mNinePatchChunk = null; 
    } 
    mRecycled = true; 
    } 
} 

私がコメントについて混乱していた偽それはで使用中であることを示し、ネイティブレベル、ネイティブピクセルオブジェクトはまだネイティブレベルで使用されますか?
メソッドnativeRecycle(mNativeBitmap)がfalseを返す場合、関連するメモリはGCによってのみ収集されるはずですか?最初にrecycle() methodを呼び出すと、mRecycledがtrueに設定され、再度nativeRecycle(mNativeBitmap)メソッドに移動することはできません。

答えて

1

Bitmap.cppソースを参照してください。

https://github.com/android/platform_frameworks_base/blob/master/core/jni/android/graphics/Bitmap.cpp

static const JNINativeMethod gBitmapMethods[] = { 
    ... 
    { "nativeRecycle", "(J)Z", (void*)Bitmap_recycle }, 
    ... 
} 

nativeRecycle())(Bitmap_recycleを呼び出します。

static jboolean Bitmap_recycle(JNIEnv* env, jobject, jlong bitmapHandle) { 
    LocalScopedBitmap bitmap(bitmapHandle); 
    bitmap->freePixels(); 
    return JNI_TRUE; 
} 

bitmap-> freePixelsは、()(参照カウントが左である)、ビットマップが扱われているビットマップが複数回使用され、そのうちのいくつかは、まだ解放されていない場合、これが意味

void Bitmap::freePixels() { 
    AutoMutex _lock(mLock); 
    if (mPinnedRefCount == 0) { 
     doFreePixels(); 
     mPixelStorageType = PixelStorageType::Invalid; 
    } 
} 

呼び出しますまだ使用中です。

(しかしBitmap_recycle()がtrueを返すようです...)


リサイクル()Javaオブジェクト(A)のためです。
nativeRecycle()はJavaオブジェクト(B)では使用できません。

A:Bが多い:1つの参照。
したがって、Aのうちの1つがリサイクルされても、Bは生きている可能性があります。
別のAのrecycle()が呼び出され、BのnativeRecycle()が呼び出されます。

GCはJavaオブジェクト(A)用です。
ネイティブのものではありません(B)。

+0

したがって、メソッドrecycle()を呼び出すと、ビットマップにシステムがGCにそれを扱う他の参照がまだありますか? mRecycledフィールドはtrueに設定され、nativeRecycle()は決して再び呼び出されないためです。 – zhenganyi

+0

説明が追加されました。 – Toris

+0

追加の説明をいただきありがとうございます。このソースコードスニペットを理解することは役に立ちます。ところで、私はこれらの関連知識をどのように得ることができますか?または、どこで見つけることができますか? – zhenganyi

関連する問題