From ab6fc2a86f34be455c144a2d691e94909998c959 Mon Sep 17 00:00:00 2001 From: Ashok Bhat Date: Thu, 13 Feb 2014 09:47:18 +0000 Subject: [PATCH] Use long for pointers in opengl/EGL classes EGL classes in frameworks/base have to be updated to support 64-bit platforms. Key changes in the EGL classes include [x] EGLObjectHandle class - EGLObjectHandle class has two public methods (constructor and getHandle) that assume handles are 32-bit. They have not been changed. Instead, two new hidden methods (EGLObjectHandle(long) and getNativeHandle) have been added. [x] EG14 class - Two public methods eglGetDisplay and eglCreatePbufferFromClientBuffer assume that handles are 32-bit. They have been changed to throw unsupported operation exception on non 32-bit machines. Two new methods eglGetDisplay(long) and eglCreatePbufferFromClientBuffer(...long buffer..) have been added to support 64-bit handles. To allow the above changes in frameworks/base EGL classes, corresponding code generation mechanism in frameworks/native has been updated. Change-Id: I5d0a62e10c20ccf05f610d6608b8dfb6414b5116 Signed-off-by: Ashok Bhat --- opengl/tools/glgen/src/JType.java | 4 +- opengl/tools/glgen/static/egl/EGLConfig.java | 4 +- opengl/tools/glgen/static/egl/EGLContext.java | 4 +- opengl/tools/glgen/static/egl/EGLDisplay.java | 4 +- .../glgen/static/egl/EGLObjectHandle.java | 32 +++++++- opengl/tools/glgen/static/egl/EGLSurface.java | 4 +- opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp | 27 +++---- .../tools/glgen/stubs/egl/EGLExtcHeader.cpp | 26 +++---- .../egl/eglCreatePbufferFromClientBuffer.cpp | 74 +++++++++++++++++++ .../egl/eglCreatePbufferFromClientBuffer.java | 23 ++++++ ...eglCreatePbufferFromClientBuffer.nativeReg | 2 + .../tools/glgen/stubs/egl/eglGetDisplay.cpp | 23 ++++++ .../tools/glgen/stubs/egl/eglGetDisplay.java | 14 ++++ .../glgen/stubs/egl/eglGetDisplay.nativeReg | 2 + 14 files changed, 203 insertions(+), 40 deletions(-) create mode 100755 opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.cpp create mode 100755 opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.java create mode 100755 opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.nativeReg create mode 100755 opengl/tools/glgen/stubs/egl/eglGetDisplay.cpp create mode 100755 opengl/tools/glgen/stubs/egl/eglGetDisplay.java create mode 100755 opengl/tools/glgen/stubs/egl/eglGetDisplay.nativeReg diff --git a/opengl/tools/glgen/src/JType.java b/opengl/tools/glgen/src/JType.java index b10e7e255..c6e227e5f 100644 --- a/opengl/tools/glgen/src/JType.java +++ b/opengl/tools/glgen/src/JType.java @@ -57,8 +57,8 @@ public class JType { typeMapping.put(new CType("EGLenum"), new JType("int")); typeMapping.put(new CType("EGLNativePixmapType"), new JType("int")); typeMapping.put(new CType("EGLNativeWindowType"), new JType("int")); - typeMapping.put(new CType("EGLNativeDisplayType"), new JType("int")); - typeMapping.put(new CType("EGLClientBuffer"), new JType("int")); + typeMapping.put(new CType("EGLNativeDisplayType"), new JType("long")); + typeMapping.put(new CType("EGLClientBuffer"), new JType("long")); typeMapping.put(new CType("EGLnsecsANDROID"), new JType("long")); // EGL nonprimitive types diff --git a/opengl/tools/glgen/static/egl/EGLConfig.java b/opengl/tools/glgen/static/egl/EGLConfig.java index a7a6bbb8c..9881070dc 100644 --- a/opengl/tools/glgen/static/egl/EGLConfig.java +++ b/opengl/tools/glgen/static/egl/EGLConfig.java @@ -22,7 +22,7 @@ package android.opengl; * */ public class EGLConfig extends EGLObjectHandle { - private EGLConfig(int handle) { + private EGLConfig(long handle) { super(handle); } @@ -32,6 +32,6 @@ public class EGLConfig extends EGLObjectHandle { if (!(o instanceof EGLConfig)) return false; EGLConfig that = (EGLConfig) o; - return getHandle() == that.getHandle(); + return getNativeHandle() == that.getNativeHandle(); } } diff --git a/opengl/tools/glgen/static/egl/EGLContext.java b/opengl/tools/glgen/static/egl/EGLContext.java index c93bd6ea7..f791e7e10 100644 --- a/opengl/tools/glgen/static/egl/EGLContext.java +++ b/opengl/tools/glgen/static/egl/EGLContext.java @@ -22,7 +22,7 @@ package android.opengl; * */ public class EGLContext extends EGLObjectHandle { - private EGLContext(int handle) { + private EGLContext(long handle) { super(handle); } @@ -32,6 +32,6 @@ public class EGLContext extends EGLObjectHandle { if (!(o instanceof EGLContext)) return false; EGLContext that = (EGLContext) o; - return getHandle() == that.getHandle(); + return getNativeHandle() == that.getNativeHandle(); } } diff --git a/opengl/tools/glgen/static/egl/EGLDisplay.java b/opengl/tools/glgen/static/egl/EGLDisplay.java index 5b8043a30..e8727617f 100644 --- a/opengl/tools/glgen/static/egl/EGLDisplay.java +++ b/opengl/tools/glgen/static/egl/EGLDisplay.java @@ -22,7 +22,7 @@ package android.opengl; * */ public class EGLDisplay extends EGLObjectHandle { - private EGLDisplay(int handle) { + private EGLDisplay(long handle) { super(handle); } @@ -32,6 +32,6 @@ public class EGLDisplay extends EGLObjectHandle { if (!(o instanceof EGLDisplay)) return false; EGLDisplay that = (EGLDisplay) o; - return getHandle() == that.getHandle(); + return getNativeHandle() == that.getNativeHandle(); } } diff --git a/opengl/tools/glgen/static/egl/EGLObjectHandle.java b/opengl/tools/glgen/static/egl/EGLObjectHandle.java index d2710de47..e6e397602 100644 --- a/opengl/tools/glgen/static/egl/EGLObjectHandle.java +++ b/opengl/tools/glgen/static/egl/EGLObjectHandle.java @@ -22,12 +22,20 @@ package android.opengl; * */ public abstract class EGLObjectHandle { - private final int mHandle; + private final long mHandle; + // TODO Deprecate EGLObjectHandle(int) method protected EGLObjectHandle(int handle) { mHandle = handle; } - + // TODO Unhide the EGLObjectHandle(long) method + /** + * {@hide} + */ + protected EGLObjectHandle(long handle) { + mHandle = handle; + } + // TODO Deprecate getHandle() method in favor of getNativeHandle() /** * Returns the native handle of the wrapped EGL object. This handle can be * cast to the corresponding native type on the native side. @@ -37,11 +45,27 @@ public abstract class EGLObjectHandle { * @return the native handle of the wrapped EGL object. */ public int getHandle() { - return mHandle; + if ((mHandle & 0xffffffffL) != mHandle) { + throw new UnsupportedOperationException(); + } + return (int)mHandle; } + // TODO Unhide getNativeHandle() method + /** + * {@hide} + */ + public long getNativeHandle() { + return mHandle; + } @Override public int hashCode() { - return getHandle(); + /* + * Based on the algorithm suggested in + * http://developer.android.com/reference/java/lang/Object.html + */ + int result = 17; + result = 31 * result + (int) (mHandle ^ (mHandle >>> 32)); + return result; } } diff --git a/opengl/tools/glgen/static/egl/EGLSurface.java b/opengl/tools/glgen/static/egl/EGLSurface.java index c379dc986..c200f7290 100644 --- a/opengl/tools/glgen/static/egl/EGLSurface.java +++ b/opengl/tools/glgen/static/egl/EGLSurface.java @@ -22,7 +22,7 @@ package android.opengl; * */ public class EGLSurface extends EGLObjectHandle { - private EGLSurface(int handle) { + private EGLSurface(long handle) { super(handle); } @@ -32,6 +32,6 @@ public class EGLSurface extends EGLObjectHandle { if (!(o instanceof EGLSurface)) return false; EGLSurface that = (EGLSurface) o; - return getHandle() == that.getHandle(); + return getNativeHandle() == that.getNativeHandle(); } } diff --git a/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp b/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp index 54de1e7b7..a372362f6 100644 --- a/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp +++ b/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp @@ -69,22 +69,22 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass) jclass eglconfigClassLocal = _env->FindClass("android/opengl/EGLConfig"); eglconfigClass = (jclass) _env->NewGlobalRef(eglconfigClassLocal); - egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getHandle", "()I"); - eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getHandle", "()I"); - eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getHandle", "()I"); - eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getHandle", "()I"); + egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getNativeHandle", "()J"); + eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getNativeHandle", "()J"); + eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getNativeHandle", "()J"); + eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getNativeHandle", "()J"); - egldisplayConstructor = _env->GetMethodID(egldisplayClass, "", "(I)V"); - eglcontextConstructor = _env->GetMethodID(eglcontextClass, "", "(I)V"); - eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "", "(I)V"); - eglconfigConstructor = _env->GetMethodID(eglconfigClass, "", "(I)V"); + egldisplayConstructor = _env->GetMethodID(egldisplayClass, "", "(J)V"); + eglcontextConstructor = _env->GetMethodID(eglcontextClass, "", "(J)V"); + eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "", "(J)V"); + eglconfigConstructor = _env->GetMethodID(eglconfigClass, "", "(J)V"); - jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, (jint)EGL_NO_CONTEXT); + jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, reinterpret_cast(EGL_NO_CONTEXT)); eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject); - jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, (jint)EGL_NO_DISPLAY); + jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, reinterpret_cast(EGL_NO_DISPLAY)); eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject); - jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, (jint)EGL_NO_SURFACE); + jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, reinterpret_cast(EGL_NO_SURFACE)); eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject); @@ -106,7 +106,8 @@ fromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) { "Object is set to null."); } - return (void*) (_env->CallIntMethod(obj, mid)); + jlong handle = _env->CallLongMethod(obj, mid); + return reinterpret_cast(handle); } static jobject @@ -126,7 +127,7 @@ toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) { return eglNoSurfaceObject; } - return _env->NewObject(cls, con, (jint)handle); + return _env->NewObject(cls, con, reinterpret_cast(handle)); } // -------------------------------------------------------------------------- diff --git a/opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp b/opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp index 5e1ffa101..b5c19df78 100644 --- a/opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp +++ b/opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp @@ -70,22 +70,22 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass) jclass eglconfigClassLocal = _env->FindClass("android/opengl/EGLConfig"); eglconfigClass = (jclass) _env->NewGlobalRef(eglconfigClassLocal); - egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getHandle", "()I"); - eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getHandle", "()I"); - eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getHandle", "()I"); - eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getHandle", "()I"); + egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getNativeHandle", "()J"); + eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getNativeHandle", "()J"); + eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getNativeHandle", "()J"); + eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getNativeHandle", "()J"); - egldisplayConstructor = _env->GetMethodID(egldisplayClass, "", "(I)V"); - eglcontextConstructor = _env->GetMethodID(eglcontextClass, "", "(I)V"); - eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "", "(I)V"); - eglconfigConstructor = _env->GetMethodID(eglconfigClass, "", "(I)V"); + egldisplayConstructor = _env->GetMethodID(egldisplayClass, "", "(J)V"); + eglcontextConstructor = _env->GetMethodID(eglcontextClass, "", "(J)V"); + eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "", "(J)V"); + eglconfigConstructor = _env->GetMethodID(eglconfigClass, "", "(J)V"); - jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, (jint)EGL_NO_CONTEXT); + jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, reinterpret_cast(EGL_NO_CONTEXT)); eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject); - jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, (jint)EGL_NO_DISPLAY); + jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, reinterpret_cast(EGL_NO_DISPLAY)); eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject); - jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, (jint)EGL_NO_SURFACE); + jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, reinterpret_cast(EGL_NO_SURFACE)); eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject); @@ -107,7 +107,7 @@ fromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) { "Object is set to null."); } - return (void*) (_env->CallIntMethod(obj, mid)); + return reinterpret_cast(_env->CallLongMethod(obj, mid)); } static jobject @@ -127,7 +127,7 @@ toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) { return eglNoSurfaceObject; } - return _env->NewObject(cls, con, (jint)handle); + return _env->NewObject(cls, con, reinterpret_cast(handle)); } // -------------------------------------------------------------------------- diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.cpp b/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.cpp new file mode 100755 index 000000000..f09c17161 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.cpp @@ -0,0 +1,74 @@ +/* EGLSurface eglCreatePbufferFromClientBuffer ( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list ) */ +static jobject +android_eglCreatePbufferFromClientBuffer + (JNIEnv *_env, jobject _this, jobject dpy, jint buftype, jlong buffer, jobject config, jintArray attrib_list_ref, jint offset) { + jint _exception = 0; + const char * _exceptionType = NULL; + const char * _exceptionMessage = NULL; + EGLSurface _returnValue = (EGLSurface) 0; + EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); + EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config); + bool attrib_list_sentinel = false; + EGLint *attrib_list_base = (EGLint *) 0; + jint _remaining; + EGLint *attrib_list = (EGLint *) 0; + + if (!attrib_list_ref) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "attrib_list == null"; + goto exit; + } + if (offset < 0) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "offset < 0"; + goto exit; + } + _remaining = _env->GetArrayLength(attrib_list_ref) - offset; + attrib_list_base = (EGLint *) + _env->GetPrimitiveArrayCritical(attrib_list_ref, (jboolean *)0); + attrib_list = attrib_list_base + offset; + attrib_list_sentinel = false; + for (int i = _remaining - 1; i >= 0; i--) { + if (attrib_list[i] == EGL_NONE){ + attrib_list_sentinel = true; + break; + } + } + if (attrib_list_sentinel == false) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "attrib_list must contain EGL_NONE!"; + goto exit; + } + + _returnValue = eglCreatePbufferFromClientBuffer( + (EGLDisplay)dpy_native, + (EGLenum)buftype, + reinterpret_cast(buffer), + (EGLConfig)config_native, + (EGLint *)attrib_list + ); + +exit: + if (attrib_list_base) { + _env->ReleasePrimitiveArrayCritical(attrib_list_ref, attrib_list_base, + JNI_ABORT); + } + if (_exception) { + jniThrowException(_env, _exceptionType, _exceptionMessage); + } + return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue); +} + +static jobject +android_eglCreatePbufferFromClientBufferInt + (JNIEnv *_env, jobject _this, jobject dpy, jint buftype, jint buffer, jobject config, jintArray attrib_list_ref, jint offset) { + if(sizeof(void*) != sizeof(uint32_t)) { + jniThrowException(_env, "java/lang/UnsupportedOperationException", "eglCreatePbufferFromClientBuffer"); + return 0; + } + return android_eglCreatePbufferFromClientBuffer(_env, _this, dpy, buftype, buffer, config, attrib_list_ref, offset); +} + diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.java b/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.java new file mode 100755 index 000000000..c2ed1d7c2 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.java @@ -0,0 +1,23 @@ + // C function EGLSurface eglCreatePbufferFromClientBuffer ( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list ) + // TODO Deprecate the below method + public static native EGLSurface eglCreatePbufferFromClientBuffer( + EGLDisplay dpy, + int buftype, + int buffer, + EGLConfig config, + int[] attrib_list, + int offset + ); + // TODO Unhide the below method + /** + * {@hide} + */ + public static native EGLSurface eglCreatePbufferFromClientBuffer( + EGLDisplay dpy, + int buftype, + long buffer, + EGLConfig config, + int[] attrib_list, + int offset + ); + diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.nativeReg b/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.nativeReg new file mode 100755 index 000000000..477e62555 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.nativeReg @@ -0,0 +1,2 @@ +{"eglCreatePbufferFromClientBuffer", "(Landroid/opengl/EGLDisplay;IILandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferFromClientBufferInt }, +{"eglCreatePbufferFromClientBuffer", "(Landroid/opengl/EGLDisplay;IJLandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferFromClientBuffer }, \ No newline at end of file diff --git a/opengl/tools/glgen/stubs/egl/eglGetDisplay.cpp b/opengl/tools/glgen/stubs/egl/eglGetDisplay.cpp new file mode 100755 index 000000000..4c353a2a9 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglGetDisplay.cpp @@ -0,0 +1,23 @@ +/* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */ +static jobject +android_eglGetDisplay + (JNIEnv *_env, jobject _this, jlong display_id) { + EGLDisplay _returnValue = (EGLDisplay) 0; + _returnValue = eglGetDisplay( + reinterpret_cast(display_id) + ); + return toEGLHandle(_env, egldisplayClass, egldisplayConstructor, _returnValue); +} + +/* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */ +static jobject +android_eglGetDisplayInt + (JNIEnv *_env, jobject _this, jint display_id) { + + if (sizeof(void*) != sizeof(uint32_t)) { + jniThrowException(_env, "java/lang/UnsupportedOperationException", "eglGetDisplay"); + return 0; + } + return android_eglGetDisplay(_env, _this, display_id); +} + diff --git a/opengl/tools/glgen/stubs/egl/eglGetDisplay.java b/opengl/tools/glgen/stubs/egl/eglGetDisplay.java new file mode 100755 index 000000000..532eb0982 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglGetDisplay.java @@ -0,0 +1,14 @@ + // C function EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) + // TODO Deprecate the eglGetDisplay(int) API method + + public static native EGLDisplay eglGetDisplay( + int display_id + ); + // TODO Unhide the eglGetDisplay(long) API method + /** + * {@hide} + */ + public static native EGLDisplay eglGetDisplay( + long display_id + ); + diff --git a/opengl/tools/glgen/stubs/egl/eglGetDisplay.nativeReg b/opengl/tools/glgen/stubs/egl/eglGetDisplay.nativeReg new file mode 100755 index 000000000..acfbb1af7 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglGetDisplay.nativeReg @@ -0,0 +1,2 @@ +{"eglGetDisplay", "(I)Landroid/opengl/EGLDisplay;", (void *) android_eglGetDisplayInt }, +{"eglGetDisplay", "(J)Landroid/opengl/EGLDisplay;", (void *) android_eglGetDisplay }, \ No newline at end of file