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