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