Home | History | Annotate | Download | only in jni
      1 /*
      2 ** Copyright 2012, The Android Open Source Project
      3 **
      4 ** Licensed under the Apache License, Version 2.0 (the "License");
      5 ** you may not use this file except in compliance with the License.
      6 ** You may obtain a copy of the License at
      7 **
      8 **     http://www.apache.org/licenses/LICENSE-2.0
      9 **
     10 ** Unless required by applicable law or agreed to in writing, software
     11 ** distributed under the License is distributed on an "AS IS" BASIS,
     12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 ** See the License for the specific language governing permissions and
     14 ** limitations under the License.
     15 */
     16 
     17 // This source file is automatically generated
     18 
     19 #include "jni.h"
     20 #include "JNIHelp.h"
     21 #include <android_runtime/AndroidRuntime.h>
     22 #include <android_runtime/android_view_Surface.h>
     23 #include <android_runtime/android_graphics_SurfaceTexture.h>
     24 #include <utils/misc.h>
     25 
     26 #include <assert.h>
     27 #include <EGL/egl.h>
     28 
     29 #include <gui/Surface.h>
     30 #include <gui/GLConsumer.h>
     31 #include <gui/Surface.h>
     32 
     33 #include <ui/ANativeObjectBase.h>
     34 
     35 static int initialized = 0;
     36 
     37 static jclass egldisplayClass;
     38 static jclass eglcontextClass;
     39 static jclass eglsurfaceClass;
     40 static jclass eglconfigClass;
     41 
     42 static jmethodID egldisplayGetHandleID;
     43 static jmethodID eglcontextGetHandleID;
     44 static jmethodID eglsurfaceGetHandleID;
     45 static jmethodID eglconfigGetHandleID;
     46 
     47 static jmethodID egldisplayConstructor;
     48 static jmethodID eglcontextConstructor;
     49 static jmethodID eglsurfaceConstructor;
     50 static jmethodID eglconfigConstructor;
     51 
     52 static jobject eglNoContextObject;
     53 static jobject eglNoDisplayObject;
     54 static jobject eglNoSurfaceObject;
     55 
     56 
     57 
     58 /* Cache method IDs each time the class is loaded. */
     59 
     60 static void
     61 nativeClassInit(JNIEnv *_env, jclass glImplClass)
     62 {
     63     jclass egldisplayClassLocal = _env->FindClass("android/opengl/EGLDisplay");
     64     egldisplayClass = (jclass) _env->NewGlobalRef(egldisplayClassLocal);
     65     jclass eglcontextClassLocal = _env->FindClass("android/opengl/EGLContext");
     66     eglcontextClass = (jclass) _env->NewGlobalRef(eglcontextClassLocal);
     67     jclass eglsurfaceClassLocal = _env->FindClass("android/opengl/EGLSurface");
     68     eglsurfaceClass = (jclass) _env->NewGlobalRef(eglsurfaceClassLocal);
     69     jclass eglconfigClassLocal = _env->FindClass("android/opengl/EGLConfig");
     70     eglconfigClass = (jclass) _env->NewGlobalRef(eglconfigClassLocal);
     71 
     72     egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getNativeHandle", "()J");
     73     eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getNativeHandle", "()J");
     74     eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getNativeHandle", "()J");
     75     eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getNativeHandle", "()J");
     76 
     77 
     78     egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(J)V");
     79     eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(J)V");
     80     eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(J)V");
     81     eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(J)V");
     82 
     83     jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, reinterpret_cast<jlong>(EGL_NO_CONTEXT));
     84     eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject);
     85     jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, reinterpret_cast<jlong>(EGL_NO_DISPLAY));
     86     eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject);
     87     jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, reinterpret_cast<jlong>(EGL_NO_SURFACE));
     88     eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject);
     89 
     90 
     91     jclass eglClass = _env->FindClass("android/opengl/EGL14");
     92     jfieldID noContextFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_CONTEXT", "Landroid/opengl/EGLContext;");
     93     _env->SetStaticObjectField(eglClass, noContextFieldID, eglNoContextObject);
     94 
     95     jfieldID noDisplayFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_DISPLAY", "Landroid/opengl/EGLDisplay;");
     96     _env->SetStaticObjectField(eglClass, noDisplayFieldID, eglNoDisplayObject);
     97 
     98     jfieldID noSurfaceFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_SURFACE", "Landroid/opengl/EGLSurface;");
     99     _env->SetStaticObjectField(eglClass, noSurfaceFieldID, eglNoSurfaceObject);
    100 }
    101 
    102 static void *
    103 fromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) {
    104     if (obj == NULL){
    105         jniThrowException(_env, "java/lang/IllegalArgumentException",
    106                           "Object is set to null.");
    107     }
    108 
    109     jlong handle = _env->CallLongMethod(obj, mid);
    110     return reinterpret_cast<void*>(handle);
    111 }
    112 
    113 static jobject
    114 toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) {
    115     if (cls == eglcontextClass &&
    116        (EGLContext)handle == EGL_NO_CONTEXT) {
    117            return eglNoContextObject;
    118     }
    119 
    120     if (cls == egldisplayClass &&
    121        (EGLDisplay)handle == EGL_NO_DISPLAY) {
    122            return eglNoDisplayObject;
    123     }
    124 
    125     if (cls == eglsurfaceClass &&
    126        (EGLSurface)handle == EGL_NO_SURFACE) {
    127            return eglNoSurfaceObject;
    128     }
    129 
    130     return _env->NewObject(cls, con, reinterpret_cast<jlong>(handle));
    131 }
    132 
    133 // --------------------------------------------------------------------------
    134 /* EGLint eglGetError ( void ) */
    135 static jint
    136 android_eglGetError
    137   (JNIEnv *_env, jobject _this) {
    138     EGLint _returnValue = (EGLint) 0;
    139     _returnValue = eglGetError();
    140     return (jint)_returnValue;
    141 }
    142 
    143 /* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */
    144 static jobject
    145 android_eglGetDisplay
    146   (JNIEnv *_env, jobject _this, jlong display_id) {
    147     EGLDisplay _returnValue = (EGLDisplay) 0;
    148     _returnValue = eglGetDisplay(
    149         reinterpret_cast<EGLNativeDisplayType>(display_id)
    150     );
    151     return toEGLHandle(_env, egldisplayClass, egldisplayConstructor, _returnValue);
    152 }
    153 
    154 /* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */
    155 static jobject
    156 android_eglGetDisplayInt
    157   (JNIEnv *_env, jobject _this, jint display_id) {
    158 
    159     if ((EGLNativeDisplayType)display_id != EGL_DEFAULT_DISPLAY) {
    160         jniThrowException(_env, "java/lang/UnsupportedOperationException", "eglGetDisplay");
    161         return 0;
    162     }
    163     return android_eglGetDisplay(_env, _this, display_id);
    164 }
    165 
    166 /* EGLBoolean eglInitialize ( EGLDisplay dpy, EGLint *major, EGLint *minor ) */
    167 static jboolean
    168 android_eglInitialize
    169   (JNIEnv *_env, jobject _this, jobject dpy, jintArray major_ref, jint majorOffset, jintArray minor_ref, jint minorOffset) {
    170     jint _exception = 0;
    171     const char * _exceptionType = NULL;
    172     const char * _exceptionMessage = NULL;
    173     EGLBoolean _returnValue = (EGLBoolean) 0;
    174     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    175     EGLint *major_base = (EGLint *) 0;
    176     jint _majorRemaining;
    177     EGLint *major = (EGLint *) 0;
    178     EGLint *minor_base = (EGLint *) 0;
    179     jint _minorRemaining;
    180     EGLint *minor = (EGLint *) 0;
    181 
    182     if (!major_ref) {
    183         _exception = 1;
    184         _exceptionType = "java/lang/IllegalArgumentException";
    185         _exceptionMessage = "major == null";
    186         goto exit;
    187     }
    188     if (majorOffset < 0) {
    189         _exception = 1;
    190         _exceptionType = "java/lang/IllegalArgumentException";
    191         _exceptionMessage = "majorOffset < 0";
    192         goto exit;
    193     }
    194     _majorRemaining = _env->GetArrayLength(major_ref) - majorOffset;
    195     if (_majorRemaining < 1) {
    196         _exception = 1;
    197         _exceptionType = "java/lang/IllegalArgumentException";
    198         _exceptionMessage = "length - majorOffset < 1 < needed";
    199         goto exit;
    200     }
    201     major_base = (EGLint *)
    202         _env->GetPrimitiveArrayCritical(major_ref, (jboolean *)0);
    203     major = major_base + majorOffset;
    204 
    205     if (!minor_ref) {
    206         _exception = 1;
    207         _exceptionType = "java/lang/IllegalArgumentException";
    208         _exceptionMessage = "minor == null";
    209         goto exit;
    210     }
    211     if (minorOffset < 0) {
    212         _exception = 1;
    213         _exceptionType = "java/lang/IllegalArgumentException";
    214         _exceptionMessage = "minorOffset < 0";
    215         goto exit;
    216     }
    217     _minorRemaining = _env->GetArrayLength(minor_ref) - minorOffset;
    218     if (_minorRemaining < 1) {
    219         _exception = 1;
    220         _exceptionType = "java/lang/IllegalArgumentException";
    221         _exceptionMessage = "length - minorOffset < 1 < needed";
    222         goto exit;
    223     }
    224     minor_base = (EGLint *)
    225         _env->GetPrimitiveArrayCritical(minor_ref, (jboolean *)0);
    226     minor = minor_base + minorOffset;
    227 
    228     _returnValue = eglInitialize(
    229         (EGLDisplay)dpy_native,
    230         (EGLint *)major,
    231         (EGLint *)minor
    232     );
    233 
    234 exit:
    235     if (minor_base) {
    236         _env->ReleasePrimitiveArrayCritical(minor_ref, minor_base,
    237             _exception ? JNI_ABORT: 0);
    238     }
    239     if (major_base) {
    240         _env->ReleasePrimitiveArrayCritical(major_ref, major_base,
    241             _exception ? JNI_ABORT: 0);
    242     }
    243     if (_exception) {
    244         jniThrowException(_env, _exceptionType, _exceptionMessage);
    245     }
    246     return (jboolean)_returnValue;
    247 }
    248 
    249 /* EGLBoolean eglTerminate ( EGLDisplay dpy ) */
    250 static jboolean
    251 android_eglTerminate
    252   (JNIEnv *_env, jobject _this, jobject dpy) {
    253     EGLBoolean _returnValue = (EGLBoolean) 0;
    254     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    255 
    256     _returnValue = eglTerminate(
    257         (EGLDisplay)dpy_native
    258     );
    259     return (jboolean)_returnValue;
    260 }
    261 
    262 /* const char * eglQueryString ( EGLDisplay dpy, EGLint name ) */
    263 static jstring
    264 android_eglQueryString__Landroind_opengl_EGLDisplay_2I
    265   (JNIEnv *_env, jobject _this, jobject dpy, jint name) {
    266     const char* chars = (const char*) eglQueryString(
    267         (EGLDisplay)fromEGLHandle(_env, egldisplayGetHandleID, dpy),
    268         (EGLint)name
    269     );
    270     return _env->NewStringUTF(chars);
    271 }
    272 /* EGLBoolean eglGetConfigs ( EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config ) */
    273 static jboolean
    274 android_eglGetConfigs
    275   (JNIEnv *_env, jobject _this, jobject dpy, jobjectArray configs_ref, jint configsOffset, jint config_size, jintArray num_config_ref, jint num_configOffset) {
    276     jint _exception = 0;
    277     const char * _exceptionType = NULL;
    278     const char * _exceptionMessage = NULL;
    279     EGLBoolean _returnValue = (EGLBoolean) 0;
    280     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    281     jint _configsRemaining;
    282     EGLConfig *configs = (EGLConfig *) 0;
    283     EGLint *num_config_base = (EGLint *) 0;
    284     jint _num_configRemaining;
    285     EGLint *num_config = (EGLint *) 0;
    286 
    287     if (!configs_ref) {
    288         _exception = 1;
    289         _exceptionType = "java/lang/IllegalArgumentException";
    290         _exceptionMessage = "configs == null";
    291         goto exit;
    292     }
    293     if (configsOffset < 0) {
    294         _exception = 1;
    295         _exceptionType = "java/lang/IllegalArgumentException";
    296         _exceptionMessage = "configsOffset < 0";
    297         goto exit;
    298     }
    299     _configsRemaining = _env->GetArrayLength(configs_ref) - configsOffset;
    300     if (_configsRemaining < config_size) {
    301         _exception = 1;
    302         _exceptionType = "java/lang/IllegalArgumentException";
    303         _exceptionMessage = "length - configsOffset < config_size < needed";
    304         goto exit;
    305     }
    306     configs = new EGLConfig[_configsRemaining];
    307 
    308     if (!num_config_ref) {
    309         _exception = 1;
    310         _exceptionType = "java/lang/IllegalArgumentException";
    311         _exceptionMessage = "num_config == null";
    312         goto exit;
    313     }
    314     if (num_configOffset < 0) {
    315         _exception = 1;
    316         _exceptionType = "java/lang/IllegalArgumentException";
    317         _exceptionMessage = "num_configOffset < 0";
    318         goto exit;
    319     }
    320     _num_configRemaining = _env->GetArrayLength(num_config_ref) - num_configOffset;
    321     num_config_base = (EGLint *)
    322         _env->GetPrimitiveArrayCritical(num_config_ref, (jboolean *)0);
    323     num_config = num_config_base + num_configOffset;
    324 
    325     _returnValue = eglGetConfigs(
    326         (EGLDisplay)dpy_native,
    327         (EGLConfig *)configs,
    328         (EGLint)config_size,
    329         (EGLint *)num_config
    330     );
    331 
    332 exit:
    333     if (num_config_base) {
    334         _env->ReleasePrimitiveArrayCritical(num_config_ref, num_config_base,
    335             _exception ? JNI_ABORT: 0);
    336     }
    337     if (configs) {
    338         for (int i = 0; i < _configsRemaining; i++) {
    339             jobject configs_new = toEGLHandle(_env, eglconfigClass, eglconfigConstructor, configs[i]);
    340             _env->SetObjectArrayElement(configs_ref, i + configsOffset, configs_new);
    341         }
    342         delete[] configs;
    343     }
    344     if (_exception) {
    345         jniThrowException(_env, _exceptionType, _exceptionMessage);
    346     }
    347     return (jboolean)_returnValue;
    348 }
    349 
    350 /* EGLBoolean eglChooseConfig ( EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config ) */
    351 static jboolean
    352 android_eglChooseConfig
    353   (JNIEnv *_env, jobject _this, jobject dpy, jintArray attrib_list_ref, jint attrib_listOffset, jobjectArray configs_ref, jint configsOffset, jint config_size, jintArray num_config_ref, jint num_configOffset) {
    354     jint _exception = 0;
    355     const char * _exceptionType = NULL;
    356     const char * _exceptionMessage = NULL;
    357     EGLBoolean _returnValue = (EGLBoolean) 0;
    358     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    359     bool attrib_list_sentinel = false;
    360     EGLint *attrib_list_base = (EGLint *) 0;
    361     jint _attrib_listRemaining;
    362     EGLint *attrib_list = (EGLint *) 0;
    363     jint _configsRemaining;
    364     EGLConfig *configs = (EGLConfig *) 0;
    365     EGLint *num_config_base = (EGLint *) 0;
    366     jint _num_configRemaining;
    367     EGLint *num_config = (EGLint *) 0;
    368 
    369     if (!attrib_list_ref) {
    370         _exception = 1;
    371         _exceptionType = "java/lang/IllegalArgumentException";
    372         _exceptionMessage = "attrib_list == null";
    373         goto exit;
    374     }
    375     if (attrib_listOffset < 0) {
    376         _exception = 1;
    377         _exceptionType = "java/lang/IllegalArgumentException";
    378         _exceptionMessage = "attrib_listOffset < 0";
    379         goto exit;
    380     }
    381     _attrib_listRemaining = _env->GetArrayLength(attrib_list_ref) - attrib_listOffset;
    382     attrib_list_base = (EGLint *)
    383         _env->GetPrimitiveArrayCritical(attrib_list_ref, (jboolean *)0);
    384     attrib_list = attrib_list_base + attrib_listOffset;
    385     attrib_list_sentinel = false;
    386     for (int i = _attrib_listRemaining - 1; i >= 0; i--)  {
    387         if (attrib_list[i] == EGL_NONE){
    388             attrib_list_sentinel = true;
    389             break;
    390         }
    391     }
    392     if (attrib_list_sentinel == false) {
    393         _exception = 1;
    394         _exceptionType = "java/lang/IllegalArgumentException";
    395         _exceptionMessage = "attrib_list must contain EGL_NONE!";
    396         goto exit;
    397     }
    398 
    399     if (!configs_ref) {
    400         _exception = 1;
    401         _exceptionType = "java/lang/IllegalArgumentException";
    402         _exceptionMessage = "configs == null";
    403         goto exit;
    404     }
    405     if (configsOffset < 0) {
    406         _exception = 1;
    407         _exceptionType = "java/lang/IllegalArgumentException";
    408         _exceptionMessage = "configsOffset < 0";
    409         goto exit;
    410     }
    411     _configsRemaining = _env->GetArrayLength(configs_ref) - configsOffset;
    412     if (_configsRemaining < config_size) {
    413         _exception = 1;
    414         _exceptionType = "java/lang/IllegalArgumentException";
    415         _exceptionMessage = "length - configsOffset < config_size < needed";
    416         goto exit;
    417     }
    418     configs = new EGLConfig[_configsRemaining];
    419 
    420     if (!num_config_ref) {
    421         _exception = 1;
    422         _exceptionType = "java/lang/IllegalArgumentException";
    423         _exceptionMessage = "num_config == null";
    424         goto exit;
    425     }
    426     if (num_configOffset < 0) {
    427         _exception = 1;
    428         _exceptionType = "java/lang/IllegalArgumentException";
    429         _exceptionMessage = "num_configOffset < 0";
    430         goto exit;
    431     }
    432     _num_configRemaining = _env->GetArrayLength(num_config_ref) - num_configOffset;
    433     if (_num_configRemaining < 1) {
    434         _exception = 1;
    435         _exceptionType = "java/lang/IllegalArgumentException";
    436         _exceptionMessage = "length - num_configOffset < 1 < needed";
    437         goto exit;
    438     }
    439     num_config_base = (EGLint *)
    440         _env->GetPrimitiveArrayCritical(num_config_ref, (jboolean *)0);
    441     num_config = num_config_base + num_configOffset;
    442 
    443     _returnValue = eglChooseConfig(
    444         (EGLDisplay)dpy_native,
    445         (EGLint *)attrib_list,
    446         (EGLConfig *)configs,
    447         (EGLint)config_size,
    448         (EGLint *)num_config
    449     );
    450 
    451 exit:
    452     if (num_config_base) {
    453         _env->ReleasePrimitiveArrayCritical(num_config_ref, num_config_base,
    454             _exception ? JNI_ABORT: 0);
    455     }
    456     if (attrib_list_base) {
    457         _env->ReleasePrimitiveArrayCritical(attrib_list_ref, attrib_list_base,
    458             JNI_ABORT);
    459     }
    460     if (configs) {
    461         for (int i = 0; i < _configsRemaining; i++) {
    462             jobject configs_new = toEGLHandle(_env, eglconfigClass, eglconfigConstructor, configs[i]);
    463             _env->SetObjectArrayElement(configs_ref, i + configsOffset, configs_new);
    464         }
    465         delete[] configs;
    466     }
    467     if (_exception) {
    468         jniThrowException(_env, _exceptionType, _exceptionMessage);
    469     }
    470     return (jboolean)_returnValue;
    471 }
    472 
    473 /* EGLBoolean eglGetConfigAttrib ( EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value ) */
    474 static jboolean
    475 android_eglGetConfigAttrib
    476   (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jint attribute, jintArray value_ref, jint offset) {
    477     jint _exception = 0;
    478     const char * _exceptionType = NULL;
    479     const char * _exceptionMessage = NULL;
    480     EGLBoolean _returnValue = (EGLBoolean) 0;
    481     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    482     EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
    483     EGLint *value_base = (EGLint *) 0;
    484     jint _remaining;
    485     EGLint *value = (EGLint *) 0;
    486 
    487     if (!value_ref) {
    488         _exception = 1;
    489         _exceptionType = "java/lang/IllegalArgumentException";
    490         _exceptionMessage = "value == null";
    491         goto exit;
    492     }
    493     if (offset < 0) {
    494         _exception = 1;
    495         _exceptionType = "java/lang/IllegalArgumentException";
    496         _exceptionMessage = "offset < 0";
    497         goto exit;
    498     }
    499     _remaining = _env->GetArrayLength(value_ref) - offset;
    500     if (_remaining < 1) {
    501         _exception = 1;
    502         _exceptionType = "java/lang/IllegalArgumentException";
    503         _exceptionMessage = "length - offset < 1 < needed";
    504         goto exit;
    505     }
    506     value_base = (EGLint *)
    507         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
    508     value = value_base + offset;
    509 
    510     _returnValue = eglGetConfigAttrib(
    511         (EGLDisplay)dpy_native,
    512         (EGLConfig)config_native,
    513         (EGLint)attribute,
    514         (EGLint *)value
    515     );
    516 
    517 exit:
    518     if (value_base) {
    519         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
    520             _exception ? JNI_ABORT: 0);
    521     }
    522     if (_exception) {
    523         jniThrowException(_env, _exceptionType, _exceptionMessage);
    524     }
    525     return (jboolean)_returnValue;
    526 }
    527 
    528 /* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */
    529 static jobject
    530 android_eglCreateWindowSurface
    531   (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject win, jintArray attrib_list_ref, jint offset) {
    532     jint _exception = 0;
    533     const char * _exceptionType = "";
    534     const char * _exceptionMessage = "";
    535     EGLSurface _returnValue = (EGLSurface) 0;
    536     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    537     EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
    538     int attrib_list_sentinel = 0;
    539     EGLint *attrib_list_base = (EGLint *) 0;
    540     jint _remaining;
    541     EGLint *attrib_list = (EGLint *) 0;
    542     android::sp<ANativeWindow> window;
    543 
    544     if (!attrib_list_ref) {
    545         _exception = 1;
    546         _exceptionType = "java/lang/IllegalArgumentException";
    547         _exceptionMessage = "attrib_list == null";
    548         goto exit;
    549     }
    550     if (offset < 0) {
    551         _exception = 1;
    552         _exceptionType = "java/lang/IllegalArgumentException";
    553         _exceptionMessage = "offset < 0";
    554         goto exit;
    555     }
    556     if (win == NULL) {
    557 not_valid_surface:
    558         _exception = 1;
    559         _exceptionType = "java/lang/IllegalArgumentException";
    560         _exceptionMessage = "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface";
    561         goto exit;
    562     }
    563 
    564     window = android::android_view_Surface_getNativeWindow(_env, win);
    565 
    566     if (window == NULL)
    567         goto not_valid_surface;
    568 
    569     _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
    570     attrib_list_base = (EGLint *)
    571         _env->GetPrimitiveArrayCritical(attrib_list_ref, (jboolean *)0);
    572     attrib_list = attrib_list_base + offset;
    573     attrib_list_sentinel = 0;
    574     for (int i = _remaining - 1; i >= 0; i--)  {
    575         if (*((EGLint*)(attrib_list + i)) == EGL_NONE){
    576             attrib_list_sentinel = 1;
    577             break;
    578         }
    579     }
    580     if (attrib_list_sentinel == 0) {
    581         _exception = 1;
    582         _exceptionType = "java/lang/IllegalArgumentException";
    583         _exceptionMessage = "attrib_list must contain EGL_NONE!";
    584         goto exit;
    585     }
    586 
    587     _returnValue = eglCreateWindowSurface(
    588         (EGLDisplay)dpy_native,
    589         (EGLConfig)config_native,
    590         (EGLNativeWindowType)window.get(),
    591         (EGLint *)attrib_list
    592     );
    593 
    594 exit:
    595     if (attrib_list_base) {
    596         _env->ReleasePrimitiveArrayCritical(attrib_list_ref, attrib_list_base,
    597             JNI_ABORT);
    598     }
    599     if (_exception) {
    600         jniThrowException(_env, _exceptionType, _exceptionMessage);
    601     }
    602     return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
    603 }
    604 
    605 /* EGLSurface eglCreateWindowSurface ( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ) */
    606 static jobject
    607 android_eglCreateWindowSurfaceTexture
    608   (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject win, jintArray attrib_list_ref, jint offset) {
    609     jint _exception = 0;
    610     const char * _exceptionType = "";
    611     const char * _exceptionMessage = "";
    612     EGLSurface _returnValue = (EGLSurface) 0;
    613     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    614     EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
    615     int attrib_list_sentinel = 0;
    616     EGLint *attrib_list_base = (EGLint *) 0;
    617     jint _remaining;
    618     EGLint *attrib_list = (EGLint *) 0;
    619     android::sp<ANativeWindow> window;
    620     android::sp<android::IGraphicBufferProducer> producer;
    621 
    622     if (!attrib_list_ref) {
    623         _exception = 1;
    624         _exceptionType = "java/lang/IllegalArgumentException";
    625         _exceptionMessage = "attrib_list == null";
    626         goto exit;
    627     }
    628     if (offset < 0) {
    629         _exception = 1;
    630         _exceptionType = "java/lang/IllegalArgumentException";
    631         _exceptionMessage = "offset < 0";
    632         goto exit;
    633     }
    634     if (win == NULL) {
    635 not_valid_surface:
    636         _exception = 1;
    637         _exceptionType = "java/lang/IllegalArgumentException";
    638         _exceptionMessage = "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface";
    639         goto exit;
    640     }
    641     producer = android::SurfaceTexture_getProducer(_env, win);
    642 
    643     if (producer == NULL)
    644         goto not_valid_surface;
    645 
    646     window = new android::Surface(producer, true);
    647 
    648     if (window == NULL)
    649         goto not_valid_surface;
    650 
    651     _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
    652     attrib_list_base = (EGLint *)
    653         _env->GetPrimitiveArrayCritical(attrib_list_ref, (jboolean *)0);
    654     attrib_list = attrib_list_base + offset;
    655     attrib_list_sentinel = 0;
    656     for (int i = _remaining - 1; i >= 0; i--)  {
    657         if (*((EGLint*)(attrib_list + i)) == EGL_NONE){
    658             attrib_list_sentinel = 1;
    659             break;
    660         }
    661     }
    662     if (attrib_list_sentinel == 0) {
    663         _exception = 1;
    664         _exceptionType = "java/lang/IllegalArgumentException";
    665         _exceptionMessage = "attrib_list must contain EGL_NONE!";
    666         goto exit;
    667     }
    668 
    669     _returnValue = eglCreateWindowSurface(
    670         (EGLDisplay)dpy_native,
    671         (EGLConfig)config_native,
    672         (EGLNativeWindowType)window.get(),
    673         (EGLint *)attrib_list
    674     );
    675 
    676 exit:
    677     if (attrib_list_base) {
    678         _env->ReleasePrimitiveArrayCritical(attrib_list_ref, attrib_list_base,
    679             JNI_ABORT);
    680     }
    681     if (_exception) {
    682         jniThrowException(_env, _exceptionType, _exceptionMessage);
    683     }
    684     return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
    685 }
    686 /* EGLSurface eglCreatePbufferSurface ( EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list ) */
    687 static jobject
    688 android_eglCreatePbufferSurface
    689   (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jintArray attrib_list_ref, jint offset) {
    690     jint _exception = 0;
    691     const char * _exceptionType = NULL;
    692     const char * _exceptionMessage = NULL;
    693     EGLSurface _returnValue = (EGLSurface) 0;
    694     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    695     EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
    696     bool attrib_list_sentinel = false;
    697     EGLint *attrib_list_base = (EGLint *) 0;
    698     jint _remaining;
    699     EGLint *attrib_list = (EGLint *) 0;
    700 
    701     if (!attrib_list_ref) {
    702         _exception = 1;
    703         _exceptionType = "java/lang/IllegalArgumentException";
    704         _exceptionMessage = "attrib_list == null";
    705         goto exit;
    706     }
    707     if (offset < 0) {
    708         _exception = 1;
    709         _exceptionType = "java/lang/IllegalArgumentException";
    710         _exceptionMessage = "offset < 0";
    711         goto exit;
    712     }
    713     _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
    714     attrib_list_base = (EGLint *)
    715         _env->GetPrimitiveArrayCritical(attrib_list_ref, (jboolean *)0);
    716     attrib_list = attrib_list_base + offset;
    717     attrib_list_sentinel = false;
    718     for (int i = _remaining - 1; i >= 0; i--)  {
    719         if (attrib_list[i] == EGL_NONE){
    720             attrib_list_sentinel = true;
    721             break;
    722         }
    723     }
    724     if (attrib_list_sentinel == false) {
    725         _exception = 1;
    726         _exceptionType = "java/lang/IllegalArgumentException";
    727         _exceptionMessage = "attrib_list must contain EGL_NONE!";
    728         goto exit;
    729     }
    730 
    731     _returnValue = eglCreatePbufferSurface(
    732         (EGLDisplay)dpy_native,
    733         (EGLConfig)config_native,
    734         (EGLint *)attrib_list
    735     );
    736 
    737 exit:
    738     if (attrib_list_base) {
    739         _env->ReleasePrimitiveArrayCritical(attrib_list_ref, attrib_list_base,
    740             JNI_ABORT);
    741     }
    742     if (_exception) {
    743         jniThrowException(_env, _exceptionType, _exceptionMessage);
    744     }
    745     return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
    746 }
    747 
    748 /* EGLSurface eglCreatePixmapSurface ( EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list ) */
    749 static jobject
    750 android_eglCreatePixmapSurface
    751   (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jint pixmap, jintArray attrib_list_ref, jint offset) {
    752     jniThrowException(_env, "java/lang/UnsupportedOperationException",
    753         "eglCreatePixmapSurface");
    754     return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, (EGLSurface) 0);
    755 }
    756 
    757 /* EGLBoolean eglDestroySurface ( EGLDisplay dpy, EGLSurface surface ) */
    758 static jboolean
    759 android_eglDestroySurface
    760   (JNIEnv *_env, jobject _this, jobject dpy, jobject surface) {
    761     EGLBoolean _returnValue = (EGLBoolean) 0;
    762     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    763     EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
    764 
    765     _returnValue = eglDestroySurface(
    766         (EGLDisplay)dpy_native,
    767         (EGLSurface)surface_native
    768     );
    769     return (jboolean)_returnValue;
    770 }
    771 
    772 /* EGLBoolean eglQuerySurface ( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value ) */
    773 static jboolean
    774 android_eglQuerySurface
    775   (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint attribute, jintArray value_ref, jint offset) {
    776     jint _exception = 0;
    777     const char * _exceptionType = NULL;
    778     const char * _exceptionMessage = NULL;
    779     EGLBoolean _returnValue = (EGLBoolean) 0;
    780     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    781     EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
    782     EGLint *value_base = (EGLint *) 0;
    783     jint _remaining;
    784     EGLint *value = (EGLint *) 0;
    785 
    786     if (!value_ref) {
    787         _exception = 1;
    788         _exceptionType = "java/lang/IllegalArgumentException";
    789         _exceptionMessage = "value == null";
    790         goto exit;
    791     }
    792     if (offset < 0) {
    793         _exception = 1;
    794         _exceptionType = "java/lang/IllegalArgumentException";
    795         _exceptionMessage = "offset < 0";
    796         goto exit;
    797     }
    798     _remaining = _env->GetArrayLength(value_ref) - offset;
    799     if (_remaining < 1) {
    800         _exception = 1;
    801         _exceptionType = "java/lang/IllegalArgumentException";
    802         _exceptionMessage = "length - offset < 1 < needed";
    803         goto exit;
    804     }
    805     value_base = (EGLint *)
    806         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
    807     value = value_base + offset;
    808 
    809     _returnValue = eglQuerySurface(
    810         (EGLDisplay)dpy_native,
    811         (EGLSurface)surface_native,
    812         (EGLint)attribute,
    813         (EGLint *)value
    814     );
    815 
    816 exit:
    817     if (value_base) {
    818         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
    819             _exception ? JNI_ABORT: 0);
    820     }
    821     if (_exception) {
    822         jniThrowException(_env, _exceptionType, _exceptionMessage);
    823     }
    824     return (jboolean)_returnValue;
    825 }
    826 
    827 /* EGLBoolean eglBindAPI ( EGLenum api ) */
    828 static jboolean
    829 android_eglBindAPI
    830   (JNIEnv *_env, jobject _this, jint api) {
    831     EGLBoolean _returnValue = (EGLBoolean) 0;
    832     _returnValue = eglBindAPI(
    833         (EGLenum)api
    834     );
    835     return (jboolean)_returnValue;
    836 }
    837 
    838 /* EGLenum eglQueryAPI ( void ) */
    839 static jint
    840 android_eglQueryAPI
    841   (JNIEnv *_env, jobject _this) {
    842     EGLenum _returnValue = (EGLenum) 0;
    843     _returnValue = eglQueryAPI();
    844     return (jint)_returnValue;
    845 }
    846 
    847 /* EGLBoolean eglWaitClient ( void ) */
    848 static jboolean
    849 android_eglWaitClient
    850   (JNIEnv *_env, jobject _this) {
    851     EGLBoolean _returnValue = (EGLBoolean) 0;
    852     _returnValue = eglWaitClient();
    853     return (jboolean)_returnValue;
    854 }
    855 
    856 /* EGLBoolean eglReleaseThread ( void ) */
    857 static jboolean
    858 android_eglReleaseThread
    859   (JNIEnv *_env, jobject _this) {
    860     EGLBoolean _returnValue = (EGLBoolean) 0;
    861     _returnValue = eglReleaseThread();
    862     return (jboolean)_returnValue;
    863 }
    864 
    865 /* EGLSurface eglCreatePbufferFromClientBuffer ( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list ) */
    866 static jobject
    867 android_eglCreatePbufferFromClientBuffer
    868   (JNIEnv *_env, jobject _this, jobject dpy, jint buftype, jlong buffer, jobject config, jintArray attrib_list_ref, jint offset) {
    869     jint _exception = 0;
    870     const char * _exceptionType = NULL;
    871     const char * _exceptionMessage = NULL;
    872     EGLSurface _returnValue = (EGLSurface) 0;
    873     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    874     EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
    875     bool attrib_list_sentinel = false;
    876     EGLint *attrib_list_base = (EGLint *) 0;
    877     jint _remaining;
    878     EGLint *attrib_list = (EGLint *) 0;
    879 
    880     if (!attrib_list_ref) {
    881         _exception = 1;
    882         _exceptionType = "java/lang/IllegalArgumentException";
    883         _exceptionMessage = "attrib_list == null";
    884         goto exit;
    885     }
    886     if (offset < 0) {
    887         _exception = 1;
    888         _exceptionType = "java/lang/IllegalArgumentException";
    889         _exceptionMessage = "offset < 0";
    890         goto exit;
    891     }
    892     _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
    893     attrib_list_base = (EGLint *)
    894         _env->GetPrimitiveArrayCritical(attrib_list_ref, (jboolean *)0);
    895     attrib_list = attrib_list_base + offset;
    896     attrib_list_sentinel = false;
    897     for (int i = _remaining - 1; i >= 0; i--)  {
    898         if (attrib_list[i] == EGL_NONE){
    899             attrib_list_sentinel = true;
    900             break;
    901         }
    902     }
    903     if (attrib_list_sentinel == false) {
    904         _exception = 1;
    905         _exceptionType = "java/lang/IllegalArgumentException";
    906         _exceptionMessage = "attrib_list must contain EGL_NONE!";
    907         goto exit;
    908     }
    909 
    910     _returnValue = eglCreatePbufferFromClientBuffer(
    911         (EGLDisplay)dpy_native,
    912         (EGLenum)buftype,
    913         reinterpret_cast<EGLClientBuffer>(buffer),
    914         (EGLConfig)config_native,
    915         (EGLint *)attrib_list
    916     );
    917 
    918 exit:
    919     if (attrib_list_base) {
    920         _env->ReleasePrimitiveArrayCritical(attrib_list_ref, attrib_list_base,
    921             JNI_ABORT);
    922     }
    923     if (_exception) {
    924         jniThrowException(_env, _exceptionType, _exceptionMessage);
    925     }
    926     return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
    927 }
    928 
    929 static jobject
    930 android_eglCreatePbufferFromClientBufferInt
    931   (JNIEnv *_env, jobject _this, jobject dpy, jint buftype, jint buffer, jobject config, jintArray attrib_list_ref, jint offset) {
    932     if(sizeof(void*) != sizeof(uint32_t)) {
    933         jniThrowException(_env, "java/lang/UnsupportedOperationException", "eglCreatePbufferFromClientBuffer");
    934         return 0;
    935     }
    936     return android_eglCreatePbufferFromClientBuffer(_env, _this, dpy, buftype, buffer, config, attrib_list_ref, offset);
    937 }
    938 
    939 /* EGLBoolean eglSurfaceAttrib ( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value ) */
    940 static jboolean
    941 android_eglSurfaceAttrib
    942   (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint attribute, jint value) {
    943     EGLBoolean _returnValue = (EGLBoolean) 0;
    944     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    945     EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
    946 
    947     _returnValue = eglSurfaceAttrib(
    948         (EGLDisplay)dpy_native,
    949         (EGLSurface)surface_native,
    950         (EGLint)attribute,
    951         (EGLint)value
    952     );
    953     return (jboolean)_returnValue;
    954 }
    955 
    956 /* EGLBoolean eglBindTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer ) */
    957 static jboolean
    958 android_eglBindTexImage
    959   (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint buffer) {
    960     EGLBoolean _returnValue = (EGLBoolean) 0;
    961     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    962     EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
    963 
    964     _returnValue = eglBindTexImage(
    965         (EGLDisplay)dpy_native,
    966         (EGLSurface)surface_native,
    967         (EGLint)buffer
    968     );
    969     return (jboolean)_returnValue;
    970 }
    971 
    972 /* EGLBoolean eglReleaseTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer ) */
    973 static jboolean
    974 android_eglReleaseTexImage
    975   (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint buffer) {
    976     EGLBoolean _returnValue = (EGLBoolean) 0;
    977     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    978     EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
    979 
    980     _returnValue = eglReleaseTexImage(
    981         (EGLDisplay)dpy_native,
    982         (EGLSurface)surface_native,
    983         (EGLint)buffer
    984     );
    985     return (jboolean)_returnValue;
    986 }
    987 
    988 /* EGLBoolean eglSwapInterval ( EGLDisplay dpy, EGLint interval ) */
    989 static jboolean
    990 android_eglSwapInterval
    991   (JNIEnv *_env, jobject _this, jobject dpy, jint interval) {
    992     EGLBoolean _returnValue = (EGLBoolean) 0;
    993     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
    994 
    995     _returnValue = eglSwapInterval(
    996         (EGLDisplay)dpy_native,
    997         (EGLint)interval
    998     );
    999     return (jboolean)_returnValue;
   1000 }
   1001 
   1002 /* EGLContext eglCreateContext ( EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list ) */
   1003 static jobject
   1004 android_eglCreateContext
   1005   (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject share_context, jintArray attrib_list_ref, jint offset) {
   1006     jint _exception = 0;
   1007     const char * _exceptionType = NULL;
   1008     const char * _exceptionMessage = NULL;
   1009     EGLContext _returnValue = (EGLContext) 0;
   1010     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
   1011     EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
   1012     EGLContext share_context_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, share_context);
   1013     bool attrib_list_sentinel = false;
   1014     EGLint *attrib_list_base = (EGLint *) 0;
   1015     jint _remaining;
   1016     EGLint *attrib_list = (EGLint *) 0;
   1017 
   1018     if (!attrib_list_ref) {
   1019         _exception = 1;
   1020         _exceptionType = "java/lang/IllegalArgumentException";
   1021         _exceptionMessage = "attrib_list == null";
   1022         goto exit;
   1023     }
   1024     if (offset < 0) {
   1025         _exception = 1;
   1026         _exceptionType = "java/lang/IllegalArgumentException";
   1027         _exceptionMessage = "offset < 0";
   1028         goto exit;
   1029     }
   1030     _remaining = _env->GetArrayLength(attrib_list_ref) - offset;
   1031     attrib_list_base = (EGLint *)
   1032         _env->GetPrimitiveArrayCritical(attrib_list_ref, (jboolean *)0);
   1033     attrib_list = attrib_list_base + offset;
   1034     attrib_list_sentinel = false;
   1035     for (int i = _remaining - 1; i >= 0; i--)  {
   1036         if (attrib_list[i] == EGL_NONE){
   1037             attrib_list_sentinel = true;
   1038             break;
   1039         }
   1040     }
   1041     if (attrib_list_sentinel == false) {
   1042         _exception = 1;
   1043         _exceptionType = "java/lang/IllegalArgumentException";
   1044         _exceptionMessage = "attrib_list must contain EGL_NONE!";
   1045         goto exit;
   1046     }
   1047 
   1048     _returnValue = eglCreateContext(
   1049         (EGLDisplay)dpy_native,
   1050         (EGLConfig)config_native,
   1051         (EGLContext)share_context_native,
   1052         (EGLint *)attrib_list
   1053     );
   1054 
   1055 exit:
   1056     if (attrib_list_base) {
   1057         _env->ReleasePrimitiveArrayCritical(attrib_list_ref, attrib_list_base,
   1058             JNI_ABORT);
   1059     }
   1060     if (_exception) {
   1061         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1062     }
   1063     return toEGLHandle(_env, eglcontextClass, eglcontextConstructor, _returnValue);
   1064 }
   1065 
   1066 /* EGLBoolean eglDestroyContext ( EGLDisplay dpy, EGLContext ctx ) */
   1067 static jboolean
   1068 android_eglDestroyContext
   1069   (JNIEnv *_env, jobject _this, jobject dpy, jobject ctx) {
   1070     EGLBoolean _returnValue = (EGLBoolean) 0;
   1071     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
   1072     EGLContext ctx_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, ctx);
   1073 
   1074     _returnValue = eglDestroyContext(
   1075         (EGLDisplay)dpy_native,
   1076         (EGLContext)ctx_native
   1077     );
   1078     return (jboolean)_returnValue;
   1079 }
   1080 
   1081 /* EGLBoolean eglMakeCurrent ( EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx ) */
   1082 static jboolean
   1083 android_eglMakeCurrent
   1084   (JNIEnv *_env, jobject _this, jobject dpy, jobject draw, jobject read, jobject ctx) {
   1085     EGLBoolean _returnValue = (EGLBoolean) 0;
   1086     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
   1087     EGLSurface draw_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, draw);
   1088     EGLSurface read_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, read);
   1089     EGLContext ctx_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, ctx);
   1090 
   1091     _returnValue = eglMakeCurrent(
   1092         (EGLDisplay)dpy_native,
   1093         (EGLSurface)draw_native,
   1094         (EGLSurface)read_native,
   1095         (EGLContext)ctx_native
   1096     );
   1097     return (jboolean)_returnValue;
   1098 }
   1099 
   1100 /* EGLContext eglGetCurrentContext ( void ) */
   1101 static jobject
   1102 android_eglGetCurrentContext
   1103   (JNIEnv *_env, jobject _this) {
   1104     EGLContext _returnValue = (EGLContext) 0;
   1105     _returnValue = eglGetCurrentContext();
   1106     return toEGLHandle(_env, eglcontextClass, eglcontextConstructor, _returnValue);
   1107 }
   1108 
   1109 /* EGLSurface eglGetCurrentSurface ( EGLint readdraw ) */
   1110 static jobject
   1111 android_eglGetCurrentSurface
   1112   (JNIEnv *_env, jobject _this, jint readdraw) {
   1113     EGLSurface _returnValue = (EGLSurface) 0;
   1114     _returnValue = eglGetCurrentSurface(
   1115         (EGLint)readdraw
   1116     );
   1117     return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
   1118 }
   1119 
   1120 /* EGLDisplay eglGetCurrentDisplay ( void ) */
   1121 static jobject
   1122 android_eglGetCurrentDisplay
   1123   (JNIEnv *_env, jobject _this) {
   1124     EGLDisplay _returnValue = (EGLDisplay) 0;
   1125     _returnValue = eglGetCurrentDisplay();
   1126     return toEGLHandle(_env, egldisplayClass, egldisplayConstructor, _returnValue);
   1127 }
   1128 
   1129 /* EGLBoolean eglQueryContext ( EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value ) */
   1130 static jboolean
   1131 android_eglQueryContext
   1132   (JNIEnv *_env, jobject _this, jobject dpy, jobject ctx, jint attribute, jintArray value_ref, jint offset) {
   1133     jint _exception = 0;
   1134     const char * _exceptionType = NULL;
   1135     const char * _exceptionMessage = NULL;
   1136     EGLBoolean _returnValue = (EGLBoolean) 0;
   1137     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
   1138     EGLContext ctx_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, ctx);
   1139     EGLint *value_base = (EGLint *) 0;
   1140     jint _remaining;
   1141     EGLint *value = (EGLint *) 0;
   1142 
   1143     if (!value_ref) {
   1144         _exception = 1;
   1145         _exceptionType = "java/lang/IllegalArgumentException";
   1146         _exceptionMessage = "value == null";
   1147         goto exit;
   1148     }
   1149     if (offset < 0) {
   1150         _exception = 1;
   1151         _exceptionType = "java/lang/IllegalArgumentException";
   1152         _exceptionMessage = "offset < 0";
   1153         goto exit;
   1154     }
   1155     _remaining = _env->GetArrayLength(value_ref) - offset;
   1156     if (_remaining < 1) {
   1157         _exception = 1;
   1158         _exceptionType = "java/lang/IllegalArgumentException";
   1159         _exceptionMessage = "length - offset < 1 < needed";
   1160         goto exit;
   1161     }
   1162     value_base = (EGLint *)
   1163         _env->GetPrimitiveArrayCritical(value_ref, (jboolean *)0);
   1164     value = value_base + offset;
   1165 
   1166     _returnValue = eglQueryContext(
   1167         (EGLDisplay)dpy_native,
   1168         (EGLContext)ctx_native,
   1169         (EGLint)attribute,
   1170         (EGLint *)value
   1171     );
   1172 
   1173 exit:
   1174     if (value_base) {
   1175         _env->ReleasePrimitiveArrayCritical(value_ref, value_base,
   1176             _exception ? JNI_ABORT: 0);
   1177     }
   1178     if (_exception) {
   1179         jniThrowException(_env, _exceptionType, _exceptionMessage);
   1180     }
   1181     return (jboolean)_returnValue;
   1182 }
   1183 
   1184 /* EGLBoolean eglWaitGL ( void ) */
   1185 static jboolean
   1186 android_eglWaitGL
   1187   (JNIEnv *_env, jobject _this) {
   1188     EGLBoolean _returnValue = (EGLBoolean) 0;
   1189     _returnValue = eglWaitGL();
   1190     return (jboolean)_returnValue;
   1191 }
   1192 
   1193 /* EGLBoolean eglWaitNative ( EGLint engine ) */
   1194 static jboolean
   1195 android_eglWaitNative
   1196   (JNIEnv *_env, jobject _this, jint engine) {
   1197     EGLBoolean _returnValue = (EGLBoolean) 0;
   1198     _returnValue = eglWaitNative(
   1199         (EGLint)engine
   1200     );
   1201     return (jboolean)_returnValue;
   1202 }
   1203 
   1204 /* EGLBoolean eglSwapBuffers ( EGLDisplay dpy, EGLSurface surface ) */
   1205 static jboolean
   1206 android_eglSwapBuffers
   1207   (JNIEnv *_env, jobject _this, jobject dpy, jobject surface) {
   1208     EGLBoolean _returnValue = (EGLBoolean) 0;
   1209     EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
   1210     EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface);
   1211 
   1212     _returnValue = eglSwapBuffers(
   1213         (EGLDisplay)dpy_native,
   1214         (EGLSurface)surface_native
   1215     );
   1216     return (jboolean)_returnValue;
   1217 }
   1218 
   1219 /* EGLBoolean eglCopyBuffers ( EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target ) */
   1220 static jboolean
   1221 android_eglCopyBuffers
   1222   (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint target) {
   1223     jniThrowException(_env, "java/lang/UnsupportedOperationException",
   1224         "eglCopyBuffers");
   1225     return (EGLBoolean) 0;
   1226 }
   1227 
   1228 static const char *classPathName = "android/opengl/EGL14";
   1229 
   1230 static JNINativeMethod methods[] = {
   1231 {"_nativeClassInit", "()V", (void*)nativeClassInit },
   1232 {"eglGetError", "()I", (void *) android_eglGetError },
   1233 {"eglGetDisplay", "(I)Landroid/opengl/EGLDisplay;", (void *) android_eglGetDisplayInt },
   1234 {"eglGetDisplay", "(J)Landroid/opengl/EGLDisplay;", (void *) android_eglGetDisplay },
   1235 {"eglInitialize", "(Landroid/opengl/EGLDisplay;[II[II)Z", (void *) android_eglInitialize },
   1236 {"eglTerminate", "(Landroid/opengl/EGLDisplay;)Z", (void *) android_eglTerminate },
   1237 {"eglQueryString", "(Landroid/opengl/EGLDisplay;I)Ljava/lang/String;", (void *) android_eglQueryString__Landroind_opengl_EGLDisplay_2I },
   1238 {"eglGetConfigs", "(Landroid/opengl/EGLDisplay;[Landroid/opengl/EGLConfig;II[II)Z", (void *) android_eglGetConfigs },
   1239 {"eglChooseConfig", "(Landroid/opengl/EGLDisplay;[II[Landroid/opengl/EGLConfig;II[II)Z", (void *) android_eglChooseConfig },
   1240 {"eglGetConfigAttrib", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Z", (void *) android_eglGetConfigAttrib },
   1241 {"_eglCreateWindowSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreateWindowSurface },
   1242 {"_eglCreateWindowSurfaceTexture", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreateWindowSurfaceTexture },
   1243 {"eglCreatePbufferSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferSurface },
   1244 {"eglCreatePixmapSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePixmapSurface },
   1245 {"eglDestroySurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z", (void *) android_eglDestroySurface },
   1246 {"eglQuerySurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I[II)Z", (void *) android_eglQuerySurface },
   1247 {"eglBindAPI", "(I)Z", (void *) android_eglBindAPI },
   1248 {"eglQueryAPI", "()I", (void *) android_eglQueryAPI },
   1249 {"eglWaitClient", "()Z", (void *) android_eglWaitClient },
   1250 {"eglReleaseThread", "()Z", (void *) android_eglReleaseThread },
   1251 {"eglCreatePbufferFromClientBuffer", "(Landroid/opengl/EGLDisplay;IILandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferFromClientBufferInt },
   1252 {"eglCreatePbufferFromClientBuffer", "(Landroid/opengl/EGLDisplay;IJLandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferFromClientBuffer },
   1253 {"eglSurfaceAttrib", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;II)Z", (void *) android_eglSurfaceAttrib },
   1254 {"eglBindTexImage", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z", (void *) android_eglBindTexImage },
   1255 {"eglReleaseTexImage", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z", (void *) android_eglReleaseTexImage },
   1256 {"eglSwapInterval", "(Landroid/opengl/EGLDisplay;I)Z", (void *) android_eglSwapInterval },
   1257 {"eglCreateContext", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Landroid/opengl/EGLContext;[II)Landroid/opengl/EGLContext;", (void *) android_eglCreateContext },
   1258 {"eglDestroyContext", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;)Z", (void *) android_eglDestroyContext },
   1259 {"eglMakeCurrent", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;Landroid/opengl/EGLSurface;Landroid/opengl/EGLContext;)Z", (void *) android_eglMakeCurrent },
   1260 {"eglGetCurrentContext", "()Landroid/opengl/EGLContext;", (void *) android_eglGetCurrentContext },
   1261 {"eglGetCurrentSurface", "(I)Landroid/opengl/EGLSurface;", (void *) android_eglGetCurrentSurface },
   1262 {"eglGetCurrentDisplay", "()Landroid/opengl/EGLDisplay;", (void *) android_eglGetCurrentDisplay },
   1263 {"eglQueryContext", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;I[II)Z", (void *) android_eglQueryContext },
   1264 {"eglWaitGL", "()Z", (void *) android_eglWaitGL },
   1265 {"eglWaitNative", "(I)Z", (void *) android_eglWaitNative },
   1266 {"eglSwapBuffers", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z", (void *) android_eglSwapBuffers },
   1267 {"eglCopyBuffers", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z", (void *) android_eglCopyBuffers },
   1268 };
   1269 
   1270 int register_android_opengl_jni_EGL14(JNIEnv *_env)
   1271 {
   1272     int err;
   1273     err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));
   1274     return err;
   1275 }
   1276