diff options
| author | 2010-08-19 00:28:10 -0700 | |
|---|---|---|
| committer | 2010-08-19 00:28:10 -0700 | |
| commit | 8d124f709e5c55f9737a336cda353af3dfb04605 (patch) | |
| tree | adce028707f0f386852ec77b6f66bde749e49b14 | |
| parent | ae93f52e4462bbbb5cc908864c20368ac8cbf2a6 (diff) | |
| parent | 291303ba3dbb3a0173bcc82ded595ca75df7b50e (diff) | |
Merge "Fix a bug, where one thread is using JNIEnv associated with another thread." into gingerbread
| -rw-r--r-- | core/jni/android/graphics/Graphics.cpp | 27 | ||||
| -rw-r--r-- | core/jni/android/graphics/GraphicsJNI.h | 4 |
2 files changed, 22 insertions, 9 deletions
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 204bb74b03f1..578de6f0329a 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -518,35 +518,48 @@ bool GraphicsJNI::setJavaPixelRef(JNIEnv* env, SkBitmap* bitmap, /////////////////////////////////////////////////////////////////////////////// JavaPixelAllocator::JavaPixelAllocator(JNIEnv* env, bool reportSizeToVM) - : fEnv(env), fReportSizeToVM(reportSizeToVM) {} + : fReportSizeToVM(reportSizeToVM) { + if (env->GetJavaVM(&fVM) != JNI_OK) { + SkDebugf("------ [%p] env->GetJavaVM failed\n", env); + sk_throw(); + } +} bool JavaPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) { - return GraphicsJNI::setJavaPixelRef(fEnv, bitmap, ctable, fReportSizeToVM); + JNIEnv* env = vm2env(fVM); + return GraphicsJNI::setJavaPixelRef(env, bitmap, ctable, fReportSizeToVM); } //////////////////////////////////////////////////////////////////////////////// JavaMemoryUsageReporter::JavaMemoryUsageReporter(JNIEnv* env) - : fEnv(env), fTotalSize(0) {} + : fTotalSize(0) { + if (env->GetJavaVM(&fVM) != JNI_OK) { + SkDebugf("------ [%p] env->GetJavaVM failed\n", env); + sk_throw(); + } +} JavaMemoryUsageReporter::~JavaMemoryUsageReporter() { + JNIEnv* env = vm2env(fVM); jlong jtotalSize = fTotalSize; - fEnv->CallVoidMethod(gVMRuntime_singleton, + env->CallVoidMethod(gVMRuntime_singleton, gVMRuntime_trackExternalFreeMethodID, jtotalSize); } bool JavaMemoryUsageReporter::reportMemory(size_t memorySize) { jlong jsize = memorySize; // the VM wants longs for the size - bool r = fEnv->CallBooleanMethod(gVMRuntime_singleton, + JNIEnv* env = vm2env(fVM); + bool r = env->CallBooleanMethod(gVMRuntime_singleton, gVMRuntime_trackExternalAllocationMethodID, jsize); - if (GraphicsJNI::hasException(fEnv)) { + if (GraphicsJNI::hasException(env)) { return false; } if (!r) { LOGE("VM won't let us allocate %zd bytes\n", memorySize); - doThrowOOME(fEnv, "bitmap size exceeds VM budget"); + doThrowOOME(env, "bitmap size exceeds VM budget"); return false; } fTotalSize += memorySize; diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index 8d6528bde70f..1a43a3e622d1 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -80,7 +80,7 @@ public: virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable); private: - JNIEnv* fEnv; + JavaVM* fVM; bool fReportSizeToVM; }; @@ -92,7 +92,7 @@ public: virtual bool reportMemory(size_t memorySize); private: - JNIEnv* fEnv; + JavaVM* fVM; size_t fTotalSize; }; |