Merge "fix [2757903] Crash in EGL when creating an EGLSurface" into kraken
This commit is contained in:
committed by
Android (Google) Code Review
commit
9d8e8dcc84
@ -25,6 +25,8 @@
|
|||||||
#include <ui/Region.h>
|
#include <ui/Region.h>
|
||||||
#include <ui/Rect.h>
|
#include <ui/Rect.h>
|
||||||
|
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
|
||||||
#include <SkCanvas.h>
|
#include <SkCanvas.h>
|
||||||
#include <SkBitmap.h>
|
#include <SkBitmap.h>
|
||||||
#include <SkRegion.h>
|
#include <SkRegion.h>
|
||||||
@ -177,6 +179,11 @@ static sp<Surface> getSurface(JNIEnv* env, jobject clazz)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EGLNativeWindowType android_Surface_getEGLNativeWindow(
|
||||||
|
JNIEnv* env, jobject clazz) {
|
||||||
|
return getSurface(env, clazz).get();
|
||||||
|
}
|
||||||
|
|
||||||
static void setSurface(JNIEnv* env, jobject clazz, const sp<Surface>& surface)
|
static void setSurface(JNIEnv* env, jobject clazz, const sp<Surface>& surface)
|
||||||
{
|
{
|
||||||
Surface* const p = (Surface*)env->GetIntField(clazz, so.surface);
|
Surface* const p = (Surface*)env->GetIntField(clazz, so.surface);
|
||||||
|
@ -27,6 +27,9 @@
|
|||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
|
extern EGLNativeWindowType android_Surface_getEGLNativeWindow(
|
||||||
|
JNIEnv* env, jobject clazz);
|
||||||
|
|
||||||
static jclass gDisplay_class;
|
static jclass gDisplay_class;
|
||||||
static jclass gContext_class;
|
static jclass gContext_class;
|
||||||
static jclass gSurface_class;
|
static jclass gSurface_class;
|
||||||
@ -95,9 +98,6 @@ static void nativeClassInit(JNIEnv *_env, jclass eglImplClass)
|
|||||||
gSurface_NativePixelRefFieldID = _env->GetFieldID(gSurface_class, "mNativePixelRef", "I");
|
gSurface_NativePixelRefFieldID = _env->GetFieldID(gSurface_class, "mNativePixelRef", "I");
|
||||||
gConfig_EGLConfigFieldID = _env->GetFieldID(gConfig_class, "mEGLConfig", "I");
|
gConfig_EGLConfigFieldID = _env->GetFieldID(gConfig_class, "mEGLConfig", "I");
|
||||||
|
|
||||||
jclass surface_class = _env->FindClass("android/view/Surface");
|
|
||||||
gSurface_SurfaceFieldID = _env->GetFieldID(surface_class, ANDROID_VIEW_SURFACE_JNI_ID, "I");
|
|
||||||
|
|
||||||
jclass bitmap_class = _env->FindClass("android/graphics/Bitmap");
|
jclass bitmap_class = _env->FindClass("android/graphics/Bitmap");
|
||||||
gBitmap_NativeBitmapFieldID = _env->GetFieldID(bitmap_class, "mNativeBitmap", "I");
|
gBitmap_NativeBitmapFieldID = _env->GetFieldID(bitmap_class, "mNativeBitmap", "I");
|
||||||
}
|
}
|
||||||
@ -325,14 +325,15 @@ static jint jni_eglCreateWindowSurface(JNIEnv *_env, jobject _this, jobject disp
|
|||||||
}
|
}
|
||||||
EGLDisplay dpy = getDisplay(_env, display);
|
EGLDisplay dpy = getDisplay(_env, display);
|
||||||
EGLContext cnf = getConfig(_env, config);
|
EGLContext cnf = getConfig(_env, config);
|
||||||
Surface* window = 0;
|
EGLNativeWindowType window = 0;
|
||||||
if (native_window == NULL) {
|
if (native_window == NULL) {
|
||||||
not_valid_surface:
|
not_valid_surface:
|
||||||
doThrow(_env, "java/lang/IllegalArgumentException",
|
doThrow(_env, "java/lang/IllegalArgumentException",
|
||||||
"Make sure the SurfaceView or associated SurfaceHolder has a valid Surface");
|
"Make sure the SurfaceView or associated SurfaceHolder has a valid Surface");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
window = (Surface*)_env->GetIntField(native_window, gSurface_SurfaceFieldID);
|
|
||||||
|
window = android_Surface_getEGLNativeWindow(_env, native_window);
|
||||||
if (window == NULL)
|
if (window == NULL)
|
||||||
goto not_valid_surface;
|
goto not_valid_surface;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user