Home | History | Annotate | Download | only in jni
      1 /*
      2  * Copyright (C) 2011-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 #define LOG_TAG "libRS_jni"
     18 
     19 #include <stdlib.h>
     20 #include <stdio.h>
     21 #include <fcntl.h>
     22 #include <unistd.h>
     23 #include <math.h>
     24 #include <utils/misc.h>
     25 
     26 #include <core/SkBitmap.h>
     27 #include <core/SkPixelRef.h>
     28 #include <core/SkStream.h>
     29 #include <core/SkTemplates.h>
     30 #include <images/SkImageDecoder.h>
     31 
     32 #include <androidfw/Asset.h>
     33 #include <androidfw/AssetManager.h>
     34 #include <androidfw/ResourceTypes.h>
     35 
     36 #include "jni.h"
     37 #include "JNIHelp.h"
     38 #include "android_runtime/AndroidRuntime.h"
     39 #include "android_runtime/android_view_Surface.h"
     40 #include "android_runtime/android_util_AssetManager.h"
     41 
     42 #include <rs.h>
     43 #include <rsEnv.h>
     44 #include <gui/Surface.h>
     45 #include <gui/SurfaceTexture.h>
     46 #include <gui/SurfaceTextureClient.h>
     47 #include <android_runtime/android_graphics_SurfaceTexture.h>
     48 
     49 //#define LOG_API ALOGE
     50 #define LOG_API(...)
     51 
     52 using namespace android;
     53 
     54 class AutoJavaStringToUTF8 {
     55 public:
     56     AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) {
     57         fCStr = env->GetStringUTFChars(str, NULL);
     58         fLength = env->GetStringUTFLength(str);
     59     }
     60     ~AutoJavaStringToUTF8() {
     61         fEnv->ReleaseStringUTFChars(fJStr, fCStr);
     62     }
     63     const char* c_str() const { return fCStr; }
     64     jsize length() const { return fLength; }
     65 
     66 private:
     67     JNIEnv*     fEnv;
     68     jstring     fJStr;
     69     const char* fCStr;
     70     jsize       fLength;
     71 };
     72 
     73 class AutoJavaStringArrayToUTF8 {
     74 public:
     75     AutoJavaStringArrayToUTF8(JNIEnv* env, jobjectArray strings, jsize stringsLength)
     76     : mEnv(env), mStrings(strings), mStringsLength(stringsLength) {
     77         mCStrings = NULL;
     78         mSizeArray = NULL;
     79         if (stringsLength > 0) {
     80             mCStrings = (const char **)calloc(stringsLength, sizeof(char *));
     81             mSizeArray = (size_t*)calloc(stringsLength, sizeof(size_t));
     82             for (jsize ct = 0; ct < stringsLength; ct ++) {
     83                 jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
     84                 mCStrings[ct] = mEnv->GetStringUTFChars(s, NULL);
     85                 mSizeArray[ct] = mEnv->GetStringUTFLength(s);
     86             }
     87         }
     88     }
     89     ~AutoJavaStringArrayToUTF8() {
     90         for (jsize ct=0; ct < mStringsLength; ct++) {
     91             jstring s = (jstring)mEnv->GetObjectArrayElement(mStrings, ct);
     92             mEnv->ReleaseStringUTFChars(s, mCStrings[ct]);
     93         }
     94         free(mCStrings);
     95         free(mSizeArray);
     96     }
     97     const char **c_str() const { return mCStrings; }
     98     size_t *c_str_len() const { return mSizeArray; }
     99     jsize length() const { return mStringsLength; }
    100 
    101 private:
    102     JNIEnv      *mEnv;
    103     jobjectArray mStrings;
    104     const char **mCStrings;
    105     size_t      *mSizeArray;
    106     jsize        mStringsLength;
    107 };
    108 
    109 // ---------------------------------------------------------------------------
    110 
    111 static jfieldID gContextId = 0;
    112 static jfieldID gNativeBitmapID = 0;
    113 static jfieldID gTypeNativeCache = 0;
    114 
    115 static void _nInit(JNIEnv *_env, jclass _this)
    116 {
    117     gContextId             = _env->GetFieldID(_this, "mContext", "I");
    118 
    119     jclass bitmapClass = _env->FindClass("android/graphics/Bitmap");
    120     gNativeBitmapID = _env->GetFieldID(bitmapClass, "mNativeBitmap", "I");
    121 }
    122 
    123 // ---------------------------------------------------------------------------
    124 
    125 static void
    126 nContextFinish(JNIEnv *_env, jobject _this, RsContext con)
    127 {
    128     LOG_API("nContextFinish, con(%p)", con);
    129     rsContextFinish(con);
    130 }
    131 
    132 static void
    133 nAssignName(JNIEnv *_env, jobject _this, RsContext con, jint obj, jbyteArray str)
    134 {
    135     LOG_API("nAssignName, con(%p), obj(%p)", con, (void *)obj);
    136     jint len = _env->GetArrayLength(str);
    137     jbyte * cptr = (jbyte *) _env->GetPrimitiveArrayCritical(str, 0);
    138     rsAssignName(con, (void *)obj, (const char *)cptr, len);
    139     _env->ReleasePrimitiveArrayCritical(str, cptr, JNI_ABORT);
    140 }
    141 
    142 static jstring
    143 nGetName(JNIEnv *_env, jobject _this, RsContext con, jint obj)
    144 {
    145     LOG_API("nGetName, con(%p), obj(%p)", con, (void *)obj);
    146     const char *name = NULL;
    147     rsaGetName(con, (void *)obj, &name);
    148     if(name == NULL || strlen(name) == 0) {
    149         return NULL;
    150     }
    151     return _env->NewStringUTF(name);
    152 }
    153 
    154 static void
    155 nObjDestroy(JNIEnv *_env, jobject _this, RsContext con, jint obj)
    156 {
    157     LOG_API("nObjDestroy, con(%p) obj(%p)", con, (void *)obj);
    158     rsObjDestroy(con, (void *)obj);
    159 }
    160 
    161 // ---------------------------------------------------------------------------
    162 
    163 static jint
    164 nDeviceCreate(JNIEnv *_env, jobject _this)
    165 {
    166     LOG_API("nDeviceCreate");
    167     return (jint)rsDeviceCreate();
    168 }
    169 
    170 static void
    171 nDeviceDestroy(JNIEnv *_env, jobject _this, jint dev)
    172 {
    173     LOG_API("nDeviceDestroy");
    174     return rsDeviceDestroy((RsDevice)dev);
    175 }
    176 
    177 static void
    178 nDeviceSetConfig(JNIEnv *_env, jobject _this, jint dev, jint p, jint value)
    179 {
    180     LOG_API("nDeviceSetConfig  dev(%p), param(%i), value(%i)", (void *)dev, p, value);
    181     return rsDeviceSetConfig((RsDevice)dev, (RsDeviceParam)p, value);
    182 }
    183 
    184 static jint
    185 nContextCreate(JNIEnv *_env, jobject _this, jint dev, jint ver, jint sdkVer)
    186 {
    187     LOG_API("nContextCreate");
    188     return (jint)rsContextCreate((RsDevice)dev, ver, sdkVer);
    189 }
    190 
    191 static jint
    192 nContextCreateGL(JNIEnv *_env, jobject _this, jint dev, jint ver, jint sdkVer,
    193                  int colorMin, int colorPref,
    194                  int alphaMin, int alphaPref,
    195                  int depthMin, int depthPref,
    196                  int stencilMin, int stencilPref,
    197                  int samplesMin, int samplesPref, float samplesQ,
    198                  int dpi)
    199 {
    200     RsSurfaceConfig sc;
    201     sc.alphaMin = alphaMin;
    202     sc.alphaPref = alphaPref;
    203     sc.colorMin = colorMin;
    204     sc.colorPref = colorPref;
    205     sc.depthMin = depthMin;
    206     sc.depthPref = depthPref;
    207     sc.samplesMin = samplesMin;
    208     sc.samplesPref = samplesPref;
    209     sc.samplesQ = samplesQ;
    210 
    211     LOG_API("nContextCreateGL");
    212     return (jint)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
    213 }
    214 
    215 static void
    216 nContextSetPriority(JNIEnv *_env, jobject _this, RsContext con, jint p)
    217 {
    218     LOG_API("ContextSetPriority, con(%p), priority(%i)", con, p);
    219     rsContextSetPriority(con, p);
    220 }
    221 
    222 
    223 
    224 static void
    225 nContextSetSurface(JNIEnv *_env, jobject _this, RsContext con, jint width, jint height, jobject wnd)
    226 {
    227     LOG_API("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", con, width, height, (Surface *)wnd);
    228 
    229     ANativeWindow * window = NULL;
    230     if (wnd == NULL) {
    231 
    232     } else {
    233         window = android_Surface_getNativeWindow(_env, wnd).get();
    234     }
    235 
    236     rsContextSetSurface(con, width, height, window);
    237 }
    238 
    239 static void
    240 nContextSetSurfaceTexture(JNIEnv *_env, jobject _this, RsContext con, jint width, jint height, jobject sur)
    241 {
    242     LOG_API("nContextSetSurfaceTexture, con(%p), width(%i), height(%i), surface(%p)", con, width, height, (Surface *)sur);
    243 
    244     sp<ANativeWindow> window;
    245     sp<SurfaceTexture> st;
    246     if (sur == 0) {
    247 
    248     } else {
    249         st = SurfaceTexture_getSurfaceTexture(_env, sur);
    250         window = new SurfaceTextureClient(st);
    251     }
    252 
    253     rsContextSetSurface(con, width, height, window.get());
    254 }
    255 
    256 static void
    257 nContextDestroy(JNIEnv *_env, jobject _this, RsContext con)
    258 {
    259     LOG_API("nContextDestroy, con(%p)", con);
    260     rsContextDestroy(con);
    261 }
    262 
    263 static void
    264 nContextDump(JNIEnv *_env, jobject _this, RsContext con, jint bits)
    265 {
    266     LOG_API("nContextDump, con(%p)  bits(%i)", (RsContext)con, bits);
    267     rsContextDump((RsContext)con, bits);
    268 }
    269 
    270 static void
    271 nContextPause(JNIEnv *_env, jobject _this, RsContext con)
    272 {
    273     LOG_API("nContextPause, con(%p)", con);
    274     rsContextPause(con);
    275 }
    276 
    277 static void
    278 nContextResume(JNIEnv *_env, jobject _this, RsContext con)
    279 {
    280     LOG_API("nContextResume, con(%p)", con);
    281     rsContextResume(con);
    282 }
    283 
    284 
    285 static jstring
    286 nContextGetErrorMessage(JNIEnv *_env, jobject _this, RsContext con)
    287 {
    288     LOG_API("nContextGetErrorMessage, con(%p)", con);
    289     char buf[1024];
    290 
    291     size_t receiveLen;
    292     uint32_t subID;
    293     int id = rsContextGetMessage(con,
    294                                  buf, sizeof(buf),
    295                                  &receiveLen, sizeof(receiveLen),
    296                                  &subID, sizeof(subID));
    297     if (!id && receiveLen) {
    298         ALOGV("message receive buffer too small.  %i", receiveLen);
    299     }
    300     return _env->NewStringUTF(buf);
    301 }
    302 
    303 static jint
    304 nContextGetUserMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray data)
    305 {
    306     jint len = _env->GetArrayLength(data);
    307     LOG_API("nContextGetMessage, con(%p), len(%i)", con, len);
    308     jint *ptr = _env->GetIntArrayElements(data, NULL);
    309     size_t receiveLen;
    310     uint32_t subID;
    311     int id = rsContextGetMessage(con,
    312                                  ptr, len * 4,
    313                                  &receiveLen, sizeof(receiveLen),
    314                                  &subID, sizeof(subID));
    315     if (!id && receiveLen) {
    316         ALOGV("message receive buffer too small.  %i", receiveLen);
    317     }
    318     _env->ReleaseIntArrayElements(data, ptr, 0);
    319     return id;
    320 }
    321 
    322 static jint
    323 nContextPeekMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray auxData)
    324 {
    325     LOG_API("nContextPeekMessage, con(%p)", con);
    326     jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
    327     size_t receiveLen;
    328     uint32_t subID;
    329     int id = rsContextPeekMessage(con, &receiveLen, sizeof(receiveLen),
    330                                   &subID, sizeof(subID));
    331     auxDataPtr[0] = (jint)subID;
    332     auxDataPtr[1] = (jint)receiveLen;
    333     _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
    334     return id;
    335 }
    336 
    337 static void nContextInitToClient(JNIEnv *_env, jobject _this, RsContext con)
    338 {
    339     LOG_API("nContextInitToClient, con(%p)", con);
    340     rsContextInitToClient(con);
    341 }
    342 
    343 static void nContextDeinitToClient(JNIEnv *_env, jobject _this, RsContext con)
    344 {
    345     LOG_API("nContextDeinitToClient, con(%p)", con);
    346     rsContextDeinitToClient(con);
    347 }
    348 
    349 
    350 static jint
    351 nElementCreate(JNIEnv *_env, jobject _this, RsContext con, jint type, jint kind, jboolean norm, jint size)
    352 {
    353     LOG_API("nElementCreate, con(%p), type(%i), kind(%i), norm(%i), size(%i)", con, type, kind, norm, size);
    354     return (jint)rsElementCreate(con, (RsDataType)type, (RsDataKind)kind, norm, size);
    355 }
    356 
    357 static jint
    358 nElementCreate2(JNIEnv *_env, jobject _this, RsContext con,
    359                 jintArray _ids, jobjectArray _names, jintArray _arraySizes)
    360 {
    361     int fieldCount = _env->GetArrayLength(_ids);
    362     LOG_API("nElementCreate2, con(%p)", con);
    363 
    364     jint *ids = _env->GetIntArrayElements(_ids, NULL);
    365     jint *arraySizes = _env->GetIntArrayElements(_arraySizes, NULL);
    366 
    367     AutoJavaStringArrayToUTF8 names(_env, _names, fieldCount);
    368 
    369     const char **nameArray = names.c_str();
    370     size_t *sizeArray = names.c_str_len();
    371 
    372     jint id = (jint)rsElementCreate2(con,
    373                                      (RsElement *)ids, fieldCount,
    374                                      nameArray, fieldCount * sizeof(size_t),  sizeArray,
    375                                      (const uint32_t *)arraySizes, fieldCount);
    376 
    377     _env->ReleaseIntArrayElements(_ids, ids, JNI_ABORT);
    378     _env->ReleaseIntArrayElements(_arraySizes, arraySizes, JNI_ABORT);
    379     return (jint)id;
    380 }
    381 
    382 static void
    383 nElementGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _elementData)
    384 {
    385     int dataSize = _env->GetArrayLength(_elementData);
    386     LOG_API("nElementGetNativeData, con(%p)", con);
    387 
    388     // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
    389     assert(dataSize == 5);
    390 
    391     uint32_t elementData[5];
    392     rsaElementGetNativeData(con, (RsElement)id, elementData, dataSize);
    393 
    394     for(jint i = 0; i < dataSize; i ++) {
    395         _env->SetIntArrayRegion(_elementData, i, 1, (const jint*)&elementData[i]);
    396     }
    397 }
    398 
    399 
    400 static void
    401 nElementGetSubElements(JNIEnv *_env, jobject _this, RsContext con, jint id,
    402                        jintArray _IDs,
    403                        jobjectArray _names,
    404                        jintArray _arraySizes)
    405 {
    406     int dataSize = _env->GetArrayLength(_IDs);
    407     LOG_API("nElementGetSubElements, con(%p)", con);
    408 
    409     uint32_t *ids = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
    410     const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
    411     uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
    412 
    413     rsaElementGetSubElements(con, (RsElement)id, ids, names, arraySizes, (uint32_t)dataSize);
    414 
    415     for(jint i = 0; i < dataSize; i++) {
    416         _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
    417         _env->SetIntArrayRegion(_IDs, i, 1, (const jint*)&ids[i]);
    418         _env->SetIntArrayRegion(_arraySizes, i, 1, (const jint*)&arraySizes[i]);
    419     }
    420 
    421     free(ids);
    422     free(names);
    423     free(arraySizes);
    424 }
    425 
    426 // -----------------------------------
    427 
    428 static int
    429 nTypeCreate(JNIEnv *_env, jobject _this, RsContext con, RsElement eid,
    430             jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces)
    431 {
    432     LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i)",
    433             con, eid, dimx, dimy, dimz, mips, faces);
    434 
    435     jint id = (jint)rsTypeCreate(con, (RsElement)eid, dimx, dimy, dimz, mips, faces);
    436     return (jint)id;
    437 }
    438 
    439 static void
    440 nTypeGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _typeData)
    441 {
    442     // We are packing 6 items: mDimX; mDimY; mDimZ;
    443     // mDimLOD; mDimFaces; mElement; into typeData
    444     int elementCount = _env->GetArrayLength(_typeData);
    445 
    446     assert(elementCount == 6);
    447     LOG_API("nTypeCreate, con(%p)", con);
    448 
    449     uint32_t typeData[6];
    450     rsaTypeGetNativeData(con, (RsType)id, typeData, 6);
    451 
    452     for(jint i = 0; i < elementCount; i ++) {
    453         _env->SetIntArrayRegion(_typeData, i, 1, (const jint*)&typeData[i]);
    454     }
    455 }
    456 
    457 // -----------------------------------
    458 
    459 static jint
    460 nAllocationCreateTyped(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mips, jint usage, jint pointer)
    461 {
    462     LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)", con, (RsElement)type, mips, usage, (void *)pointer);
    463     return (jint) rsAllocationCreateTyped(con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage, (uint32_t)pointer);
    464 }
    465 
    466 static void
    467 nAllocationSyncAll(JNIEnv *_env, jobject _this, RsContext con, jint a, jint bits)
    468 {
    469     LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", con, (RsAllocation)a, bits);
    470     rsAllocationSyncAll(con, (RsAllocation)a, (RsAllocationUsageType)bits);
    471 }
    472 
    473 static jint
    474 nAllocationGetSurfaceTextureID(JNIEnv *_env, jobject _this, RsContext con, jint a)
    475 {
    476     LOG_API("nAllocationGetSurfaceTextureID, con(%p), a(%p)", con, (RsAllocation)a);
    477     return rsAllocationGetSurfaceTextureID(con, (RsAllocation)a);
    478 }
    479 
    480 static void
    481 nAllocationGetSurfaceTextureID2(JNIEnv *_env, jobject _this, RsContext con, jint a, jobject jst)
    482 {
    483     LOG_API("nAllocationGetSurfaceTextureID2, con(%p), a(%p)", con, (RsAllocation)a);
    484     sp<SurfaceTexture> st = SurfaceTexture_getSurfaceTexture(_env, jst);
    485 
    486     rsAllocationGetSurfaceTextureID2(con, (RsAllocation)a, st.get(), sizeof(SurfaceTexture *));
    487 }
    488 
    489 static void
    490 nAllocationSetSurface(JNIEnv *_env, jobject _this, RsContext con, RsAllocation alloc, jobject sur)
    491 {
    492     LOG_API("nAllocationSetSurfaceTexture, con(%p), alloc(%p), surface(%p)",
    493             con, alloc, (Surface *)sur);
    494 
    495     sp<Surface> s;
    496     if (sur != 0) {
    497         s = Surface_getSurface(_env, sur);
    498     }
    499 
    500     rsAllocationSetSurface(con, alloc, static_cast<ANativeWindow *>(s.get()));
    501 }
    502 
    503 static void
    504 nAllocationIoSend(JNIEnv *_env, jobject _this, RsContext con, RsAllocation alloc)
    505 {
    506     LOG_API("nAllocationIoSend, con(%p), alloc(%p)", con, alloc);
    507     rsAllocationIoSend(con, alloc);
    508 }
    509 
    510 static void
    511 nAllocationIoReceive(JNIEnv *_env, jobject _this, RsContext con, RsAllocation alloc)
    512 {
    513     LOG_API("nAllocationIoReceive, con(%p), alloc(%p)", con, alloc);
    514     rsAllocationIoReceive(con, alloc);
    515 }
    516 
    517 
    518 static void
    519 nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, RsContext con, jint alloc)
    520 {
    521     LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", con, (RsAllocation)alloc);
    522     rsAllocationGenerateMipmaps(con, (RsAllocation)alloc);
    523 }
    524 
    525 static int
    526 nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage)
    527 {
    528     SkBitmap const * nativeBitmap =
    529             (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
    530     const SkBitmap& bitmap(*nativeBitmap);
    531 
    532     bitmap.lockPixels();
    533     const void* ptr = bitmap.getPixels();
    534     jint id = (jint)rsAllocationCreateFromBitmap(con,
    535                                                   (RsType)type, (RsAllocationMipmapControl)mip,
    536                                                   ptr, bitmap.getSize(), usage);
    537     bitmap.unlockPixels();
    538     return id;
    539 }
    540 
    541 static int
    542 nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage)
    543 {
    544     SkBitmap const * nativeBitmap =
    545             (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
    546     const SkBitmap& bitmap(*nativeBitmap);
    547 
    548     bitmap.lockPixels();
    549     const void* ptr = bitmap.getPixels();
    550     jint id = (jint)rsAllocationCubeCreateFromBitmap(con,
    551                                                       (RsType)type, (RsAllocationMipmapControl)mip,
    552                                                       ptr, bitmap.getSize(), usage);
    553     bitmap.unlockPixels();
    554     return id;
    555 }
    556 
    557 static void
    558 nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap)
    559 {
    560     SkBitmap const * nativeBitmap =
    561             (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
    562     const SkBitmap& bitmap(*nativeBitmap);
    563     int w = bitmap.width();
    564     int h = bitmap.height();
    565 
    566     bitmap.lockPixels();
    567     const void* ptr = bitmap.getPixels();
    568     rsAllocation2DData(con, (RsAllocation)alloc, 0, 0,
    569                        0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
    570                        w, h, ptr, bitmap.getSize());
    571     bitmap.unlockPixels();
    572 }
    573 
    574 static void
    575 nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap)
    576 {
    577     SkBitmap const * nativeBitmap =
    578             (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
    579     const SkBitmap& bitmap(*nativeBitmap);
    580 
    581     bitmap.lockPixels();
    582     void* ptr = bitmap.getPixels();
    583     rsAllocationCopyToBitmap(con, (RsAllocation)alloc, ptr, bitmap.getSize());
    584     bitmap.unlockPixels();
    585     bitmap.notifyPixelsChanged();
    586 }
    587 
    588 static void ReleaseBitmapCallback(void *bmp)
    589 {
    590     SkBitmap const * nativeBitmap = (SkBitmap const *)bmp;
    591     nativeBitmap->unlockPixels();
    592 }
    593 
    594 
    595 static void
    596 nAllocationData1D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jintArray data, int sizeBytes)
    597 {
    598     jint len = _env->GetArrayLength(data);
    599     LOG_API("nAllocation1DData_i, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
    600     jint *ptr = _env->GetIntArrayElements(data, NULL);
    601     rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
    602     _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
    603 }
    604 
    605 static void
    606 nAllocationData1D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jshortArray data, int sizeBytes)
    607 {
    608     jint len = _env->GetArrayLength(data);
    609     LOG_API("nAllocation1DData_s, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
    610     jshort *ptr = _env->GetShortArrayElements(data, NULL);
    611     rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
    612     _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
    613 }
    614 
    615 static void
    616 nAllocationData1D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jbyteArray data, int sizeBytes)
    617 {
    618     jint len = _env->GetArrayLength(data);
    619     LOG_API("nAllocation1DData_b, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
    620     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    621     rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
    622     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    623 }
    624 
    625 static void
    626 nAllocationData1D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jfloatArray data, int sizeBytes)
    627 {
    628     jint len = _env->GetArrayLength(data);
    629     LOG_API("nAllocation1DData_f, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
    630     jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
    631     rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
    632     _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
    633 }
    634 
    635 static void
    636 //    native void rsnAllocationElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes);
    637 nAllocationElementData1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint compIdx, jbyteArray data, int sizeBytes)
    638 {
    639     jint len = _env->GetArrayLength(data);
    640     LOG_API("nAllocationElementData1D, con(%p), alloc(%p), offset(%i), comp(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, compIdx, len, sizeBytes);
    641     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    642     rsAllocation1DElementData(con, (RsAllocation)alloc, offset, lod, ptr, sizeBytes, compIdx);
    643     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    644 }
    645 
    646 static void
    647 nAllocationData2D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
    648                     jint w, jint h, jshortArray data, int sizeBytes)
    649 {
    650     jint len = _env->GetArrayLength(data);
    651     LOG_API("nAllocation2DData_s, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
    652     jshort *ptr = _env->GetShortArrayElements(data, NULL);
    653     rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
    654     _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
    655 }
    656 
    657 static void
    658 nAllocationData2D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
    659                     jint w, jint h, jbyteArray data, int sizeBytes)
    660 {
    661     jint len = _env->GetArrayLength(data);
    662     LOG_API("nAllocation2DData_b, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
    663     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    664     rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
    665     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    666 }
    667 
    668 static void
    669 nAllocationData2D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
    670                     jint w, jint h, jintArray data, int sizeBytes)
    671 {
    672     jint len = _env->GetArrayLength(data);
    673     LOG_API("nAllocation2DData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
    674     jint *ptr = _env->GetIntArrayElements(data, NULL);
    675     rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
    676     _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
    677 }
    678 
    679 static void
    680 nAllocationData2D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
    681                     jint w, jint h, jfloatArray data, int sizeBytes)
    682 {
    683     jint len = _env->GetArrayLength(data);
    684     LOG_API("nAllocation2DData_i, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i)", con, (RsAllocation)alloc, xoff, yoff, w, h, len);
    685     jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
    686     rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
    687     _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
    688 }
    689 
    690 static void
    691 nAllocationData2D_alloc(JNIEnv *_env, jobject _this, RsContext con,
    692                         jint dstAlloc, jint dstXoff, jint dstYoff,
    693                         jint dstMip, jint dstFace,
    694                         jint width, jint height,
    695                         jint srcAlloc, jint srcXoff, jint srcYoff,
    696                         jint srcMip, jint srcFace)
    697 {
    698     LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff(%i), dstYoff(%i),"
    699             " dstMip(%i), dstFace(%i), width(%i), height(%i),"
    700             " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
    701             con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
    702             width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
    703 
    704     rsAllocationCopy2DRange(con,
    705                             (RsAllocation)dstAlloc,
    706                             dstXoff, dstYoff,
    707                             dstMip, dstFace,
    708                             width, height,
    709                             (RsAllocation)srcAlloc,
    710                             srcXoff, srcYoff,
    711                             srcMip, srcFace);
    712 }
    713 
    714 static void
    715 nAllocationRead_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jintArray data)
    716 {
    717     jint len = _env->GetArrayLength(data);
    718     LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
    719     jint *ptr = _env->GetIntArrayElements(data, NULL);
    720     jsize length = _env->GetArrayLength(data);
    721     rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
    722     _env->ReleaseIntArrayElements(data, ptr, 0);
    723 }
    724 
    725 static void
    726 nAllocationRead_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jshortArray data)
    727 {
    728     jint len = _env->GetArrayLength(data);
    729     LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
    730     jshort *ptr = _env->GetShortArrayElements(data, NULL);
    731     jsize length = _env->GetArrayLength(data);
    732     rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
    733     _env->ReleaseShortArrayElements(data, ptr, 0);
    734 }
    735 
    736 static void
    737 nAllocationRead_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jbyteArray data)
    738 {
    739     jint len = _env->GetArrayLength(data);
    740     LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
    741     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    742     jsize length = _env->GetArrayLength(data);
    743     rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
    744     _env->ReleaseByteArrayElements(data, ptr, 0);
    745 }
    746 
    747 static void
    748 nAllocationRead_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jfloatArray data)
    749 {
    750     jint len = _env->GetArrayLength(data);
    751     LOG_API("nAllocationRead_f, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
    752     jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
    753     jsize length = _env->GetArrayLength(data);
    754     rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
    755     _env->ReleaseFloatArrayElements(data, ptr, 0);
    756 }
    757 
    758 static jint
    759 nAllocationGetType(JNIEnv *_env, jobject _this, RsContext con, jint a)
    760 {
    761     LOG_API("nAllocationGetType, con(%p), a(%p)", con, (RsAllocation)a);
    762     return (jint) rsaAllocationGetType(con, (RsAllocation)a);
    763 }
    764 
    765 static void
    766 nAllocationResize1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX)
    767 {
    768     LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", con, (RsAllocation)alloc, dimX);
    769     rsAllocationResize1D(con, (RsAllocation)alloc, dimX);
    770 }
    771 
    772 static void
    773 nAllocationResize2D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX, jint dimY)
    774 {
    775     LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i), sizeY(%i)", con, (RsAllocation)alloc, dimX, dimY);
    776     rsAllocationResize2D(con, (RsAllocation)alloc, dimX, dimY);
    777 }
    778 
    779 // -----------------------------------
    780 
    781 static int
    782 nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, jint native_asset)
    783 {
    784     ALOGV("______nFileA3D %u", (uint32_t) native_asset);
    785 
    786     Asset* asset = reinterpret_cast<Asset*>(native_asset);
    787 
    788     jint id = (jint)rsaFileA3DCreateFromMemory(con, asset->getBuffer(false), asset->getLength());
    789     return id;
    790 }
    791 
    792 static int
    793 nFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path)
    794 {
    795     AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
    796     if (mgr == NULL) {
    797         return 0;
    798     }
    799 
    800     AutoJavaStringToUTF8 str(_env, _path);
    801     Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
    802     if (asset == NULL) {
    803         return 0;
    804     }
    805 
    806     jint id = (jint)rsaFileA3DCreateFromAsset(con, asset);
    807     return id;
    808 }
    809 
    810 static int
    811 nFileA3DCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, jstring fileName)
    812 {
    813     AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
    814     jint id = (jint)rsaFileA3DCreateFromFile(con, fileNameUTF.c_str());
    815 
    816     return id;
    817 }
    818 
    819 static int
    820 nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D)
    821 {
    822     int32_t numEntries = 0;
    823     rsaFileA3DGetNumIndexEntries(con, &numEntries, (RsFile)fileA3D);
    824     return numEntries;
    825 }
    826 
    827 static void
    828 nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
    829 {
    830     ALOGV("______nFileA3D %u", (uint32_t) fileA3D);
    831     RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
    832 
    833     rsaFileA3DGetIndexEntries(con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
    834 
    835     for(jint i = 0; i < numEntries; i ++) {
    836         _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
    837         _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
    838     }
    839 
    840     free(fileEntries);
    841 }
    842 
    843 static int
    844 nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint index)
    845 {
    846     ALOGV("______nFileA3D %u", (uint32_t) fileA3D);
    847     jint id = (jint)rsaFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D);
    848     return id;
    849 }
    850 
    851 // -----------------------------------
    852 
    853 static int
    854 nFontCreateFromFile(JNIEnv *_env, jobject _this, RsContext con,
    855                     jstring fileName, jfloat fontSize, jint dpi)
    856 {
    857     AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
    858     jint id = (jint)rsFontCreateFromFile(con,
    859                                          fileNameUTF.c_str(), fileNameUTF.length(),
    860                                          fontSize, dpi);
    861 
    862     return id;
    863 }
    864 
    865 static int
    866 nFontCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con,
    867                            jstring name, jfloat fontSize, jint dpi, jint native_asset)
    868 {
    869     Asset* asset = reinterpret_cast<Asset*>(native_asset);
    870     AutoJavaStringToUTF8 nameUTF(_env, name);
    871 
    872     jint id = (jint)rsFontCreateFromMemory(con,
    873                                            nameUTF.c_str(), nameUTF.length(),
    874                                            fontSize, dpi,
    875                                            asset->getBuffer(false), asset->getLength());
    876     return id;
    877 }
    878 
    879 static int
    880 nFontCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path,
    881                      jfloat fontSize, jint dpi)
    882 {
    883     AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
    884     if (mgr == NULL) {
    885         return 0;
    886     }
    887 
    888     AutoJavaStringToUTF8 str(_env, _path);
    889     Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
    890     if (asset == NULL) {
    891         return 0;
    892     }
    893 
    894     jint id = (jint)rsFontCreateFromMemory(con,
    895                                            str.c_str(), str.length(),
    896                                            fontSize, dpi,
    897                                            asset->getBuffer(false), asset->getLength());
    898     delete asset;
    899     return id;
    900 }
    901 
    902 // -----------------------------------
    903 
    904 static void
    905 nScriptBindAllocation(JNIEnv *_env, jobject _this, RsContext con, jint script, jint alloc, jint slot)
    906 {
    907     LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", con, (RsScript)script, (RsAllocation)alloc, slot);
    908     rsScriptBindAllocation(con, (RsScript)script, (RsAllocation)alloc, slot);
    909 }
    910 
    911 static void
    912 nScriptSetVarI(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
    913 {
    914     LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
    915     rsScriptSetVarI(con, (RsScript)script, slot, val);
    916 }
    917 
    918 static void
    919 nScriptSetVarObj(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
    920 {
    921     LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
    922     rsScriptSetVarObj(con, (RsScript)script, slot, (RsObjectBase)val);
    923 }
    924 
    925 static void
    926 nScriptSetVarJ(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jlong val)
    927 {
    928     LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", con, (void *)script, slot, val);
    929     rsScriptSetVarJ(con, (RsScript)script, slot, val);
    930 }
    931 
    932 static void
    933 nScriptSetVarF(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, float val)
    934 {
    935     LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", con, (void *)script, slot, val);
    936     rsScriptSetVarF(con, (RsScript)script, slot, val);
    937 }
    938 
    939 static void
    940 nScriptSetVarD(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, double val)
    941 {
    942     LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", con, (void *)script, slot, val);
    943     rsScriptSetVarD(con, (RsScript)script, slot, val);
    944 }
    945 
    946 static void
    947 nScriptSetVarV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data)
    948 {
    949     LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
    950     jint len = _env->GetArrayLength(data);
    951     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    952     rsScriptSetVarV(con, (RsScript)script, slot, ptr, len);
    953     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    954 }
    955 
    956 static void
    957 nScriptSetVarVE(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data, jint elem, jintArray dims)
    958 {
    959     LOG_API("nScriptSetVarVE, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
    960     jint len = _env->GetArrayLength(data);
    961     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    962     jint dimsLen = _env->GetArrayLength(dims) * sizeof(int);
    963     jint *dimsPtr = _env->GetIntArrayElements(dims, NULL);
    964     rsScriptSetVarVE(con, (RsScript)script, slot, ptr, len, (RsElement)elem,
    965                      (const size_t*) dimsPtr, dimsLen);
    966     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    967     _env->ReleaseIntArrayElements(dims, dimsPtr, JNI_ABORT);
    968 }
    969 
    970 
    971 static void
    972 nScriptSetTimeZone(JNIEnv *_env, jobject _this, RsContext con, jint script, jbyteArray timeZone)
    973 {
    974     LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", con, (void *)script, (const char *)timeZone);
    975 
    976     jint length = _env->GetArrayLength(timeZone);
    977     jbyte* timeZone_ptr;
    978     timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
    979 
    980     rsScriptSetTimeZone(con, (RsScript)script, (const char *)timeZone_ptr, length);
    981 
    982     if (timeZone_ptr) {
    983         _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
    984     }
    985 }
    986 
    987 static void
    988 nScriptInvoke(JNIEnv *_env, jobject _this, RsContext con, jint obj, jint slot)
    989 {
    990     LOG_API("nScriptInvoke, con(%p), script(%p)", con, (void *)obj);
    991     rsScriptInvoke(con, (RsScript)obj, slot);
    992 }
    993 
    994 static void
    995 nScriptInvokeV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data)
    996 {
    997     LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
    998     jint len = _env->GetArrayLength(data);
    999     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
   1000     rsScriptInvokeV(con, (RsScript)script, slot, ptr, len);
   1001     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
   1002 }
   1003 
   1004 static void
   1005 nScriptForEach(JNIEnv *_env, jobject _this, RsContext con,
   1006                jint script, jint slot, jint ain, jint aout)
   1007 {
   1008     LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
   1009     rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, NULL, 0);
   1010 }
   1011 static void
   1012 nScriptForEachV(JNIEnv *_env, jobject _this, RsContext con,
   1013                 jint script, jint slot, jint ain, jint aout, jbyteArray params)
   1014 {
   1015     LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
   1016     jint len = _env->GetArrayLength(params);
   1017     jbyte *ptr = _env->GetByteArrayElements(params, NULL);
   1018     rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, ptr, len);
   1019     _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
   1020 }
   1021 
   1022 
   1023 // -----------------------------------
   1024 
   1025 static jint
   1026 nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con,
   1027                jstring resName, jstring cacheDir,
   1028                jbyteArray scriptRef, jint length)
   1029 {
   1030     LOG_API("nScriptCCreate, con(%p)", con);
   1031 
   1032     AutoJavaStringToUTF8 resNameUTF(_env, resName);
   1033     AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
   1034     jint ret = 0;
   1035     jbyte* script_ptr = NULL;
   1036     jint _exception = 0;
   1037     jint remaining;
   1038     if (!scriptRef) {
   1039         _exception = 1;
   1040         //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
   1041         goto exit;
   1042     }
   1043     if (length < 0) {
   1044         _exception = 1;
   1045         //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
   1046         goto exit;
   1047     }
   1048     remaining = _env->GetArrayLength(scriptRef);
   1049     if (remaining < length) {
   1050         _exception = 1;
   1051         //jniThrowException(_env, "java/lang/IllegalArgumentException",
   1052         //        "length > script.length - offset");
   1053         goto exit;
   1054     }
   1055     script_ptr = (jbyte *)
   1056         _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
   1057 
   1058     //rsScriptCSetText(con, (const char *)script_ptr, length);
   1059 
   1060     ret = (jint)rsScriptCCreate(con,
   1061                                 resNameUTF.c_str(), resNameUTF.length(),
   1062                                 cacheDirUTF.c_str(), cacheDirUTF.length(),
   1063                                 (const char *)script_ptr, length);
   1064 
   1065 exit:
   1066     if (script_ptr) {
   1067         _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
   1068                 _exception ? JNI_ABORT: 0);
   1069     }
   1070 
   1071     return ret;
   1072 }
   1073 
   1074 // ---------------------------------------------------------------------------
   1075 
   1076 static jint
   1077 nProgramStoreCreate(JNIEnv *_env, jobject _this, RsContext con,
   1078                     jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
   1079                     jboolean depthMask, jboolean ditherEnable,
   1080                     jint srcFunc, jint destFunc,
   1081                     jint depthFunc)
   1082 {
   1083     LOG_API("nProgramStoreCreate, con(%p)", con);
   1084     return (jint)rsProgramStoreCreate(con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
   1085                                       depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
   1086                                       (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
   1087 }
   1088 
   1089 // ---------------------------------------------------------------------------
   1090 
   1091 static void
   1092 nProgramBindConstants(JNIEnv *_env, jobject _this, RsContext con, jint vpv, jint slot, jint a)
   1093 {
   1094     LOG_API("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", con, (RsProgramVertex)vpv, slot, (RsAllocation)a);
   1095     rsProgramBindConstants(con, (RsProgram)vpv, slot, (RsAllocation)a);
   1096 }
   1097 
   1098 static void
   1099 nProgramBindTexture(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a)
   1100 {
   1101     LOG_API("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
   1102     rsProgramBindTexture(con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
   1103 }
   1104 
   1105 static void
   1106 nProgramBindSampler(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a)
   1107 {
   1108     LOG_API("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsSampler)a);
   1109     rsProgramBindSampler(con, (RsProgramFragment)vpf, slot, (RsSampler)a);
   1110 }
   1111 
   1112 // ---------------------------------------------------------------------------
   1113 
   1114 static jint
   1115 nProgramFragmentCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader,
   1116                        jobjectArray texNames, jintArray params)
   1117 {
   1118     AutoJavaStringToUTF8 shaderUTF(_env, shader);
   1119     jint *paramPtr = _env->GetIntArrayElements(params, NULL);
   1120     jint paramLen = _env->GetArrayLength(params);
   1121 
   1122     int texCount = _env->GetArrayLength(texNames);
   1123     AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
   1124     const char ** nameArray = names.c_str();
   1125     size_t* sizeArray = names.c_str_len();
   1126 
   1127     LOG_API("nProgramFragmentCreate, con(%p), paramLen(%i)", con, paramLen);
   1128 
   1129     jint ret = (jint)rsProgramFragmentCreate(con, shaderUTF.c_str(), shaderUTF.length(),
   1130                                              nameArray, texCount, sizeArray,
   1131                                              (uint32_t *)paramPtr, paramLen);
   1132 
   1133     _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
   1134     return ret;
   1135 }
   1136 
   1137 
   1138 // ---------------------------------------------------------------------------
   1139 
   1140 static jint
   1141 nProgramVertexCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader,
   1142                      jobjectArray texNames, jintArray params)
   1143 {
   1144     AutoJavaStringToUTF8 shaderUTF(_env, shader);
   1145     jint *paramPtr = _env->GetIntArrayElements(params, NULL);
   1146     jint paramLen = _env->GetArrayLength(params);
   1147 
   1148     LOG_API("nProgramVertexCreate, con(%p), paramLen(%i)", con, paramLen);
   1149 
   1150     int texCount = _env->GetArrayLength(texNames);
   1151     AutoJavaStringArrayToUTF8 names(_env, texNames, texCount);
   1152     const char ** nameArray = names.c_str();
   1153     size_t* sizeArray = names.c_str_len();
   1154 
   1155     jint ret = (jint)rsProgramVertexCreate(con, shaderUTF.c_str(), shaderUTF.length(),
   1156                                            nameArray, texCount, sizeArray,
   1157                                            (uint32_t *)paramPtr, paramLen);
   1158 
   1159     _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
   1160     return ret;
   1161 }
   1162 
   1163 // ---------------------------------------------------------------------------
   1164 
   1165 static jint
   1166 nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSprite, jint cull)
   1167 {
   1168     LOG_API("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", con, pointSprite, cull);
   1169     return (jint)rsProgramRasterCreate(con, pointSprite, (RsCullMode)cull);
   1170 }
   1171 
   1172 
   1173 // ---------------------------------------------------------------------------
   1174 
   1175 static void
   1176 nContextBindRootScript(JNIEnv *_env, jobject _this, RsContext con, jint script)
   1177 {
   1178     LOG_API("nContextBindRootScript, con(%p), script(%p)", con, (RsScript)script);
   1179     rsContextBindRootScript(con, (RsScript)script);
   1180 }
   1181 
   1182 static void
   1183 nContextBindProgramStore(JNIEnv *_env, jobject _this, RsContext con, jint pfs)
   1184 {
   1185     LOG_API("nContextBindProgramStore, con(%p), pfs(%p)", con, (RsProgramStore)pfs);
   1186     rsContextBindProgramStore(con, (RsProgramStore)pfs);
   1187 }
   1188 
   1189 static void
   1190 nContextBindProgramFragment(JNIEnv *_env, jobject _this, RsContext con, jint pf)
   1191 {
   1192     LOG_API("nContextBindProgramFragment, con(%p), pf(%p)", con, (RsProgramFragment)pf);
   1193     rsContextBindProgramFragment(con, (RsProgramFragment)pf);
   1194 }
   1195 
   1196 static void
   1197 nContextBindProgramVertex(JNIEnv *_env, jobject _this, RsContext con, jint pf)
   1198 {
   1199     LOG_API("nContextBindProgramVertex, con(%p), pf(%p)", con, (RsProgramVertex)pf);
   1200     rsContextBindProgramVertex(con, (RsProgramVertex)pf);
   1201 }
   1202 
   1203 static void
   1204 nContextBindProgramRaster(JNIEnv *_env, jobject _this, RsContext con, jint pf)
   1205 {
   1206     LOG_API("nContextBindProgramRaster, con(%p), pf(%p)", con, (RsProgramRaster)pf);
   1207     rsContextBindProgramRaster(con, (RsProgramRaster)pf);
   1208 }
   1209 
   1210 
   1211 // ---------------------------------------------------------------------------
   1212 
   1213 static jint
   1214 nSamplerCreate(JNIEnv *_env, jobject _this, RsContext con, jint magFilter, jint minFilter,
   1215                jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
   1216 {
   1217     LOG_API("nSamplerCreate, con(%p)", con);
   1218     return (jint)rsSamplerCreate(con,
   1219                                  (RsSamplerValue)magFilter,
   1220                                  (RsSamplerValue)minFilter,
   1221                                  (RsSamplerValue)wrapS,
   1222                                  (RsSamplerValue)wrapT,
   1223                                  (RsSamplerValue)wrapR,
   1224                                  aniso);
   1225 }
   1226 
   1227 // ---------------------------------------------------------------------------
   1228 
   1229 //native int  rsnPathCreate(int con, int prim, boolean isStatic, int vtx, int loop, float q);
   1230 static jint
   1231 nPathCreate(JNIEnv *_env, jobject _this, RsContext con, jint prim, jboolean isStatic, jint _vtx, jint _loop, jfloat q) {
   1232     LOG_API("nPathCreate, con(%p)", con);
   1233 
   1234     int id = (int)rsPathCreate(con, (RsPathPrimitive)prim, isStatic,
   1235                                (RsAllocation)_vtx,
   1236                                (RsAllocation)_loop, q);
   1237     return id;
   1238 }
   1239 
   1240 static jint
   1241 nMeshCreate(JNIEnv *_env, jobject _this, RsContext con, jintArray _vtx, jintArray _idx, jintArray _prim)
   1242 {
   1243     LOG_API("nMeshCreate, con(%p)", con);
   1244 
   1245     jint vtxLen = _env->GetArrayLength(_vtx);
   1246     jint *vtxPtr = _env->GetIntArrayElements(_vtx, NULL);
   1247     jint idxLen = _env->GetArrayLength(_idx);
   1248     jint *idxPtr = _env->GetIntArrayElements(_idx, NULL);
   1249     jint primLen = _env->GetArrayLength(_prim);
   1250     jint *primPtr = _env->GetIntArrayElements(_prim, NULL);
   1251 
   1252     int id = (int)rsMeshCreate(con,
   1253                                (RsAllocation *)vtxPtr, vtxLen,
   1254                                (RsAllocation *)idxPtr, idxLen,
   1255                                (uint32_t *)primPtr, primLen);
   1256 
   1257     _env->ReleaseIntArrayElements(_vtx, vtxPtr, 0);
   1258     _env->ReleaseIntArrayElements(_idx, idxPtr, 0);
   1259     _env->ReleaseIntArrayElements(_prim, primPtr, 0);
   1260     return id;
   1261 }
   1262 
   1263 static jint
   1264 nMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh)
   1265 {
   1266     LOG_API("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", con, (RsMesh)mesh);
   1267     jint vtxCount = 0;
   1268     rsaMeshGetVertexBufferCount(con, (RsMesh)mesh, &vtxCount);
   1269     return vtxCount;
   1270 }
   1271 
   1272 static jint
   1273 nMeshGetIndexCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh)
   1274 {
   1275     LOG_API("nMeshGetIndexCount, con(%p), Mesh(%p)", con, (RsMesh)mesh);
   1276     jint idxCount = 0;
   1277     rsaMeshGetIndexCount(con, (RsMesh)mesh, &idxCount);
   1278     return idxCount;
   1279 }
   1280 
   1281 static void
   1282 nMeshGetVertices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _ids, int numVtxIDs)
   1283 {
   1284     LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh);
   1285 
   1286     RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
   1287     rsaMeshGetVertices(con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
   1288 
   1289     for(jint i = 0; i < numVtxIDs; i ++) {
   1290         _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&allocs[i]);
   1291     }
   1292 
   1293     free(allocs);
   1294 }
   1295 
   1296 static void
   1297 nMeshGetIndices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _idxIds, jintArray _primitives, int numIndices)
   1298 {
   1299     LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh);
   1300 
   1301     RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
   1302     uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
   1303 
   1304     rsaMeshGetIndices(con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
   1305 
   1306     for(jint i = 0; i < numIndices; i ++) {
   1307         _env->SetIntArrayRegion(_idxIds, i, 1, (const jint*)&allocs[i]);
   1308         _env->SetIntArrayRegion(_primitives, i, 1, (const jint*)&prims[i]);
   1309     }
   1310 
   1311     free(allocs);
   1312     free(prims);
   1313 }
   1314 
   1315 // ---------------------------------------------------------------------------
   1316 
   1317 
   1318 static const char *classPathName = "android/renderscript/RenderScript";
   1319 
   1320 static JNINativeMethod methods[] = {
   1321 {"_nInit",                         "()V",                                     (void*)_nInit },
   1322 
   1323 {"nDeviceCreate",                  "()I",                                     (void*)nDeviceCreate },
   1324 {"nDeviceDestroy",                 "(I)V",                                    (void*)nDeviceDestroy },
   1325 {"nDeviceSetConfig",               "(III)V",                                  (void*)nDeviceSetConfig },
   1326 {"nContextGetUserMessage",         "(I[I)I",                                  (void*)nContextGetUserMessage },
   1327 {"nContextGetErrorMessage",        "(I)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
   1328 {"nContextPeekMessage",            "(I[I)I",                                  (void*)nContextPeekMessage },
   1329 
   1330 {"nContextInitToClient",           "(I)V",                                    (void*)nContextInitToClient },
   1331 {"nContextDeinitToClient",         "(I)V",                                    (void*)nContextDeinitToClient },
   1332 
   1333 
   1334 // All methods below are thread protected in java.
   1335 {"rsnContextCreate",                 "(III)I",                                (void*)nContextCreate },
   1336 {"rsnContextCreateGL",               "(IIIIIIIIIIIIIFI)I",                    (void*)nContextCreateGL },
   1337 {"rsnContextFinish",                 "(I)V",                                  (void*)nContextFinish },
   1338 {"rsnContextSetPriority",            "(II)V",                                 (void*)nContextSetPriority },
   1339 {"rsnContextSetSurface",             "(IIILandroid/view/Surface;)V",          (void*)nContextSetSurface },
   1340 {"rsnContextSetSurfaceTexture",      "(IIILandroid/graphics/SurfaceTexture;)V", (void*)nContextSetSurfaceTexture },
   1341 {"rsnContextDestroy",                "(I)V",                                  (void*)nContextDestroy },
   1342 {"rsnContextDump",                   "(II)V",                                 (void*)nContextDump },
   1343 {"rsnContextPause",                  "(I)V",                                  (void*)nContextPause },
   1344 {"rsnContextResume",                 "(I)V",                                  (void*)nContextResume },
   1345 {"rsnAssignName",                    "(II[B)V",                               (void*)nAssignName },
   1346 {"rsnGetName",                       "(II)Ljava/lang/String;",                (void*)nGetName },
   1347 {"rsnObjDestroy",                    "(II)V",                                 (void*)nObjDestroy },
   1348 
   1349 {"rsnFileA3DCreateFromFile",         "(ILjava/lang/String;)I",                (void*)nFileA3DCreateFromFile },
   1350 {"rsnFileA3DCreateFromAssetStream",  "(II)I",                                 (void*)nFileA3DCreateFromAssetStream },
   1351 {"rsnFileA3DCreateFromAsset",        "(ILandroid/content/res/AssetManager;Ljava/lang/String;)I",            (void*)nFileA3DCreateFromAsset },
   1352 {"rsnFileA3DGetNumIndexEntries",     "(II)I",                                 (void*)nFileA3DGetNumIndexEntries },
   1353 {"rsnFileA3DGetIndexEntries",        "(III[I[Ljava/lang/String;)V",           (void*)nFileA3DGetIndexEntries },
   1354 {"rsnFileA3DGetEntryByIndex",        "(III)I",                                (void*)nFileA3DGetEntryByIndex },
   1355 
   1356 {"rsnFontCreateFromFile",            "(ILjava/lang/String;FI)I",              (void*)nFontCreateFromFile },
   1357 {"rsnFontCreateFromAssetStream",     "(ILjava/lang/String;FII)I",             (void*)nFontCreateFromAssetStream },
   1358 {"rsnFontCreateFromAsset",        "(ILandroid/content/res/AssetManager;Ljava/lang/String;FI)I",            (void*)nFontCreateFromAsset },
   1359 
   1360 {"rsnElementCreate",                 "(IIIZI)I",                              (void*)nElementCreate },
   1361 {"rsnElementCreate2",                "(I[I[Ljava/lang/String;[I)I",           (void*)nElementCreate2 },
   1362 {"rsnElementGetNativeData",          "(II[I)V",                               (void*)nElementGetNativeData },
   1363 {"rsnElementGetSubElements",         "(II[I[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
   1364 
   1365 {"rsnTypeCreate",                    "(IIIIIZZ)I",                            (void*)nTypeCreate },
   1366 {"rsnTypeGetNativeData",             "(II[I)V",                               (void*)nTypeGetNativeData },
   1367 
   1368 {"rsnAllocationCreateTyped",         "(IIIII)I",                               (void*)nAllocationCreateTyped },
   1369 {"rsnAllocationCreateFromBitmap",    "(IIILandroid/graphics/Bitmap;I)I",      (void*)nAllocationCreateFromBitmap },
   1370 {"rsnAllocationCubeCreateFromBitmap","(IIILandroid/graphics/Bitmap;I)I",      (void*)nAllocationCubeCreateFromBitmap },
   1371 
   1372 {"rsnAllocationCopyFromBitmap",      "(IILandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
   1373 {"rsnAllocationCopyToBitmap",        "(IILandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
   1374 
   1375 {"rsnAllocationSyncAll",             "(III)V",                                (void*)nAllocationSyncAll },
   1376 {"rsnAllocationGetSurfaceTextureID", "(II)I",                                 (void*)nAllocationGetSurfaceTextureID },
   1377 {"rsnAllocationGetSurfaceTextureID2","(IILandroid/graphics/SurfaceTexture;)V",(void*)nAllocationGetSurfaceTextureID2 },
   1378 {"rsnAllocationSetSurface",          "(IILandroid/view/Surface;)V",           (void*)nAllocationSetSurface },
   1379 {"rsnAllocationIoSend",              "(II)V",                                 (void*)nAllocationIoSend },
   1380 {"rsnAllocationIoReceive",           "(II)V",                                 (void*)nAllocationIoReceive },
   1381 {"rsnAllocationData1D",              "(IIIII[II)V",                           (void*)nAllocationData1D_i },
   1382 {"rsnAllocationData1D",              "(IIIII[SI)V",                           (void*)nAllocationData1D_s },
   1383 {"rsnAllocationData1D",              "(IIIII[BI)V",                           (void*)nAllocationData1D_b },
   1384 {"rsnAllocationData1D",              "(IIIII[FI)V",                           (void*)nAllocationData1D_f },
   1385 {"rsnAllocationElementData1D",       "(IIIII[BI)V",                           (void*)nAllocationElementData1D },
   1386 {"rsnAllocationData2D",              "(IIIIIIII[II)V",                        (void*)nAllocationData2D_i },
   1387 {"rsnAllocationData2D",              "(IIIIIIII[SI)V",                        (void*)nAllocationData2D_s },
   1388 {"rsnAllocationData2D",              "(IIIIIIII[BI)V",                        (void*)nAllocationData2D_b },
   1389 {"rsnAllocationData2D",              "(IIIIIIII[FI)V",                        (void*)nAllocationData2D_f },
   1390 {"rsnAllocationData2D",              "(IIIIIIIIIIIII)V",                      (void*)nAllocationData2D_alloc },
   1391 {"rsnAllocationRead",                "(II[I)V",                               (void*)nAllocationRead_i },
   1392 {"rsnAllocationRead",                "(II[S)V",                               (void*)nAllocationRead_s },
   1393 {"rsnAllocationRead",                "(II[B)V",                               (void*)nAllocationRead_b },
   1394 {"rsnAllocationRead",                "(II[F)V",                               (void*)nAllocationRead_f },
   1395 {"rsnAllocationGetType",             "(II)I",                                 (void*)nAllocationGetType},
   1396 {"rsnAllocationResize1D",            "(III)V",                                (void*)nAllocationResize1D },
   1397 {"rsnAllocationResize2D",            "(IIII)V",                               (void*)nAllocationResize2D },
   1398 {"rsnAllocationGenerateMipmaps",     "(II)V",                                 (void*)nAllocationGenerateMipmaps },
   1399 
   1400 {"rsnScriptBindAllocation",          "(IIII)V",                               (void*)nScriptBindAllocation },
   1401 {"rsnScriptSetTimeZone",             "(II[B)V",                               (void*)nScriptSetTimeZone },
   1402 {"rsnScriptInvoke",                  "(III)V",                                (void*)nScriptInvoke },
   1403 {"rsnScriptInvokeV",                 "(III[B)V",                              (void*)nScriptInvokeV },
   1404 {"rsnScriptForEach",                 "(IIIII)V",                              (void*)nScriptForEach },
   1405 {"rsnScriptForEach",                 "(IIIII[B)V",                            (void*)nScriptForEachV },
   1406 {"rsnScriptSetVarI",                 "(IIII)V",                               (void*)nScriptSetVarI },
   1407 {"rsnScriptSetVarJ",                 "(IIIJ)V",                               (void*)nScriptSetVarJ },
   1408 {"rsnScriptSetVarF",                 "(IIIF)V",                               (void*)nScriptSetVarF },
   1409 {"rsnScriptSetVarD",                 "(IIID)V",                               (void*)nScriptSetVarD },
   1410 {"rsnScriptSetVarV",                 "(III[B)V",                              (void*)nScriptSetVarV },
   1411 {"rsnScriptSetVarVE",                "(III[BI[I)V",                           (void*)nScriptSetVarVE },
   1412 {"rsnScriptSetVarObj",               "(IIII)V",                               (void*)nScriptSetVarObj },
   1413 
   1414 {"rsnScriptCCreate",                 "(ILjava/lang/String;Ljava/lang/String;[BI)I",  (void*)nScriptCCreate },
   1415 
   1416 {"rsnProgramStoreCreate",            "(IZZZZZZIII)I",                         (void*)nProgramStoreCreate },
   1417 
   1418 {"rsnProgramBindConstants",          "(IIII)V",                               (void*)nProgramBindConstants },
   1419 {"rsnProgramBindTexture",            "(IIII)V",                               (void*)nProgramBindTexture },
   1420 {"rsnProgramBindSampler",            "(IIII)V",                               (void*)nProgramBindSampler },
   1421 
   1422 {"rsnProgramFragmentCreate",         "(ILjava/lang/String;[Ljava/lang/String;[I)I",              (void*)nProgramFragmentCreate },
   1423 {"rsnProgramRasterCreate",           "(IZI)I",                                (void*)nProgramRasterCreate },
   1424 {"rsnProgramVertexCreate",           "(ILjava/lang/String;[Ljava/lang/String;[I)I",              (void*)nProgramVertexCreate },
   1425 
   1426 {"rsnContextBindRootScript",         "(II)V",                                 (void*)nContextBindRootScript },
   1427 {"rsnContextBindProgramStore",       "(II)V",                                 (void*)nContextBindProgramStore },
   1428 {"rsnContextBindProgramFragment",    "(II)V",                                 (void*)nContextBindProgramFragment },
   1429 {"rsnContextBindProgramVertex",      "(II)V",                                 (void*)nContextBindProgramVertex },
   1430 {"rsnContextBindProgramRaster",      "(II)V",                                 (void*)nContextBindProgramRaster },
   1431 
   1432 {"rsnSamplerCreate",                 "(IIIIIIF)I",                            (void*)nSamplerCreate },
   1433 
   1434 {"rsnPathCreate",                    "(IIZIIF)I",                             (void*)nPathCreate },
   1435 {"rsnMeshCreate",                    "(I[I[I[I)I",                            (void*)nMeshCreate },
   1436 
   1437 {"rsnMeshGetVertexBufferCount",      "(II)I",                                 (void*)nMeshGetVertexBufferCount },
   1438 {"rsnMeshGetIndexCount",             "(II)I",                                 (void*)nMeshGetIndexCount },
   1439 {"rsnMeshGetVertices",               "(II[II)V",                              (void*)nMeshGetVertices },
   1440 {"rsnMeshGetIndices",                "(II[I[II)V",                            (void*)nMeshGetIndices },
   1441 
   1442 };
   1443 
   1444 static int registerFuncs(JNIEnv *_env)
   1445 {
   1446     return android::AndroidRuntime::registerNativeMethods(
   1447             _env, classPathName, methods, NELEM(methods));
   1448 }
   1449 
   1450 // ---------------------------------------------------------------------------
   1451 
   1452 jint JNI_OnLoad(JavaVM* vm, void* reserved)
   1453 {
   1454     JNIEnv* env = NULL;
   1455     jint result = -1;
   1456 
   1457     if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
   1458         ALOGE("ERROR: GetEnv failed\n");
   1459         goto bail;
   1460     }
   1461     assert(env != NULL);
   1462 
   1463     if (registerFuncs(env) < 0) {
   1464         ALOGE("ERROR: MediaPlayer native registration failed\n");
   1465         goto bail;
   1466     }
   1467 
   1468     /* success -- return valid version number */
   1469     result = JNI_VERSION_1_4;
   1470 
   1471 bail:
   1472     return result;
   1473 }
   1474