void AndroidPixelRef::globalRef(void* localref) { if (fWrappedPixelRef) { // delegate java obj management to the wrapped ref fWrappedPixelRef->globalRef(localref); // Note: we only ref and unref the wrapped AndroidPixelRef so that // bitmap->pixelRef()->globalRef() and globalUnref() can be used in a pair, even if // the bitmap has its underlying AndroidPixelRef swapped out/wrapped return; } if (fOnJavaHeap && sk_atomic_inc(&fGlobalRefCnt) == 0) { JNIEnv *env = vm2env(fVM); // If JNI ref was passed, it is always used if (localref) fStorageObj = (jbyteArray) localref; if (fStorageObj == NULL) { SkDebugf("No valid local ref to create a JNI global ref\n"); sk_throw(); } if (fHasGlobalRef) { // This should never happen SkDebugf("Already holding a JNI global ref"); sk_throw(); } fStorageObj = (jbyteArray) env->NewGlobalRef(fStorageObj); // TODO: Check for failure here fHasGlobalRef = true; } ref(); }
bool JavaPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) { JNIEnv* env = vm2env(fVM); fStorageObj = GraphicsJNI::allocateJavaPixelRef(env, bitmap, ctable); fAllocCount += 1; return fStorageObj != NULL; }
JavaMemoryUsageReporter::~JavaMemoryUsageReporter() { JNIEnv* env = vm2env(fVM); jlong jtotalSize = fTotalSize; env->CallVoidMethod(gVMRuntime_singleton, gVMRuntime_trackExternalFreeMethodID, jtotalSize); }
AndroidPixelRef::~AndroidPixelRef() { if (fWrappedPixelRef) { SkSafeUnref(fWrappedPixelRef); } else { SkASSERT(fStorageObj); JNIEnv* env = vm2env(fVM); env->DeleteGlobalRef(fStorageObj); } }
virtual ~AndroidPixelRef() { JNIEnv* env = vm2env(fVM); // SkDebugf("-------------- inform VM we're releasing %d bytes\n", this->getSize()); jlong jsize = this->getSize(); // the VM wants longs for the size env->CallVoidMethod(gVMRuntime_singleton, gVMRuntime_trackExternalFreeMethodID, jsize); if (GraphicsJNI::hasException(env)) { env->ExceptionClear(); } }
AndroidPixelRef::~AndroidPixelRef() { if (fWrappedPixelRef) { SkSafeUnref(fWrappedPixelRef); } else if (fOnJavaHeap) { JNIEnv* env = vm2env(fVM); if (fStorageObj && fHasGlobalRef) { env->DeleteGlobalRef(fStorageObj); } fStorageObj = NULL; } }
bool JavaPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) { JNIEnv* env = vm2env(fVM); // If allocating in the Java heap, only allow a single object to be // allocated for the lifetime of this object. if (fStorageObj != NULL) { SkDebugf("WARNING: One-shot allocator has already allocated (alloc count = %d)\n", fAllocCount); // sk_throw(); } fStorageObj = GraphicsJNI::allocateJavaPixelRef(env, bitmap, ctable); fAllocCount += 1; return fStorageObj != NULL; }
void AndroidPixelRef::globalUnref() { if (fOnJavaHeap && sk_atomic_dec(&fGlobalRefCnt) == 1) { JNIEnv *env = vm2env(fVM); if (!fHasGlobalRef) { SkDebugf("We don't have a global ref!"); sk_throw(); } env->DeleteGlobalRef(fStorageObj); fStorageObj = NULL; fHasGlobalRef = false; } unref(); }
AndroidPixelRef::~AndroidPixelRef() { if (fOnJavaHeap) { JNIEnv* env = vm2env(fVM); if (fStorageObj && fHasGlobalRef) { env->DeleteGlobalRef(fStorageObj); } fStorageObj = NULL; // Set this to NULL to prevent the SkMallocPixelRef destructor // from freeing the memory. fStorage = NULL; } }
bool JavaMemoryUsageReporter::reportMemory(size_t memorySize) { jlong jsize = memorySize; // the VM wants longs for the size JNIEnv* env = vm2env(fVM); bool r = env->CallBooleanMethod(gVMRuntime_singleton, gVMRuntime_trackExternalAllocationMethodID, jsize); if (GraphicsJNI::hasException(env)) { return false; } if (!r) { LOGE("VM won't let us allocate %zd bytes\n", memorySize); doThrowOOME(env, "bitmap size exceeds VM budget"); return false; } fTotalSize += memorySize; return true; }
void AndroidPixelRef::globalUnref() { if (fWrappedPixelRef) { // delegate java obj management to the wrapped ref fWrappedPixelRef->globalUnref(); return; } if (fOnJavaHeap && sk_atomic_dec(&fGlobalRefCnt) == 1) { JNIEnv *env = vm2env(fVM); if (!fHasGlobalRef) { SkDebugf("We don't have a global ref!"); sk_throw(); } env->DeleteGlobalRef(fStorageObj); fStorageObj = NULL; fHasGlobalRef = false; } unref(); }
void AndroidPixelRef::globalRef(void* localref) { if (fOnJavaHeap && sk_atomic_inc(&fGlobalRefCnt) == 0) { JNIEnv *env = vm2env(fVM); // If JNI ref was passed, it is always used if (localref) fStorageObj = (jbyteArray) localref; if (fStorageObj == NULL) { SkDebugf("No valid local ref to create a JNI global ref\n"); sk_throw(); } if (fHasGlobalRef) { // This should never happen SkDebugf("Already holding a JNI global ref"); sk_throw(); } fStorageObj = (jbyteArray) env->NewGlobalRef(fStorageObj); // TODO: Check for failure here fHasGlobalRef = true; } ref(); }
bool JavaPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) { JNIEnv* env = vm2env(fVM); return GraphicsJNI::setJavaPixelRef(env, bitmap, ctable, fReportSizeToVM); }