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,
    375                        jintArray _IDs,
    376                        jobjectArray _names,
    377                        jintArray _arraySizes)
    378 {
    379     int dataSize = _env->GetArrayLength(_IDs);
    380     LOG_API("nElementGetSubElements, con(%p)", con);
    381 
    382     uint32_t *ids = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
    383     const char **names = (const char **)malloc((uint32_t)dataSize * sizeof(const char *));
    384     uint32_t *arraySizes = (uint32_t *)malloc((uint32_t)dataSize * sizeof(uint32_t));
    385 
    386     rsaElementGetSubElements(con, (RsElement)id, ids, names, arraySizes, (uint32_t)dataSize);
    387 
    388     for(jint i = 0; i < dataSize; i++) {
    389         _env->SetObjectArrayElement(_names, i, _env->NewStringUTF(names[i]));
    390         _env->SetIntArrayRegion(_IDs, i, 1, (const jint*)&ids[i]);
    391         _env->SetIntArrayRegion(_arraySizes, i, 1, (const jint*)&arraySizes[i]);
    392     }
    393 
    394     free(ids);
    395     free(names);
    396     free(arraySizes);
    397 }
    398 
    399 // -----------------------------------
    400 
    401 static int
    402 nTypeCreate(JNIEnv *_env, jobject _this, RsContext con, RsElement eid,
    403             jint dimx, jint dimy, jint dimz, jboolean mips, jboolean faces)
    404 {
    405     LOG_API("nTypeCreate, con(%p) eid(%p), x(%i), y(%i), z(%i), mips(%i), faces(%i)",
    406             con, eid, dimx, dimy, dimz, mips, faces);
    407 
    408     jint id = (jint)rsTypeCreate(con, (RsElement)eid, dimx, dimy, dimz, mips, faces);
    409     return (jint)id;
    410 }
    411 
    412 static void
    413 nTypeGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArray _typeData)
    414 {
    415     // We are packing 6 items: mDimX; mDimY; mDimZ;
    416     // mDimLOD; mDimFaces; mElement; into typeData
    417     int elementCount = _env->GetArrayLength(_typeData);
    418 
    419     assert(elementCount == 6);
    420     LOG_API("nTypeCreate, con(%p)", con);
    421 
    422     uint32_t typeData[6];
    423     rsaTypeGetNativeData(con, (RsType)id, typeData, 6);
    424 
    425     for(jint i = 0; i < elementCount; i ++) {
    426         _env->SetIntArrayRegion(_typeData, i, 1, (const jint*)&typeData[i]);
    427     }
    428 }
    429 
    430 // -----------------------------------
    431 
    432 static jint
    433 nAllocationCreateTyped(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mips, jint usage)
    434 {
    435     LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i)", con, (RsElement)type, mips, usage);
    436     return (jint) rsAllocationCreateTyped(con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage);
    437 }
    438 
    439 static void
    440 nAllocationSyncAll(JNIEnv *_env, jobject _this, RsContext con, jint a, jint bits)
    441 {
    442     LOG_API("nAllocationSyncAll, con(%p), a(%p), bits(0x%08x)", con, (RsAllocation)a, bits);
    443     rsAllocationSyncAll(con, (RsAllocation)a, (RsAllocationUsageType)bits);
    444 }
    445 
    446 static void
    447 nAllocationGenerateMipmaps(JNIEnv *_env, jobject _this, RsContext con, jint alloc)
    448 {
    449     LOG_API("nAllocationGenerateMipmaps, con(%p), a(%p)", con, (RsAllocation)alloc);
    450     rsAllocationGenerateMipmaps(con, (RsAllocation)alloc);
    451 }
    452 
    453 static int
    454 nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage)
    455 {
    456     SkBitmap const * nativeBitmap =
    457             (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
    458     const SkBitmap& bitmap(*nativeBitmap);
    459 
    460     bitmap.lockPixels();
    461     const void* ptr = bitmap.getPixels();
    462     jint id = (jint)rsAllocationCreateFromBitmap(con,
    463                                                   (RsType)type, (RsAllocationMipmapControl)mip,
    464                                                   ptr, bitmap.getSize(), usage);
    465     bitmap.unlockPixels();
    466     return id;
    467 }
    468 
    469 static int
    470 nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mip, jobject jbitmap, jint usage)
    471 {
    472     SkBitmap const * nativeBitmap =
    473             (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
    474     const SkBitmap& bitmap(*nativeBitmap);
    475 
    476     bitmap.lockPixels();
    477     const void* ptr = bitmap.getPixels();
    478     jint id = (jint)rsAllocationCubeCreateFromBitmap(con,
    479                                                       (RsType)type, (RsAllocationMipmapControl)mip,
    480                                                       ptr, bitmap.getSize(), usage);
    481     bitmap.unlockPixels();
    482     return id;
    483 }
    484 
    485 static void
    486 nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap)
    487 {
    488     SkBitmap const * nativeBitmap =
    489             (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
    490     const SkBitmap& bitmap(*nativeBitmap);
    491     int w = bitmap.width();
    492     int h = bitmap.height();
    493 
    494     bitmap.lockPixels();
    495     const void* ptr = bitmap.getPixels();
    496     rsAllocation2DData(con, (RsAllocation)alloc, 0, 0,
    497                        0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
    498                        w, h, ptr, bitmap.getSize());
    499     bitmap.unlockPixels();
    500 }
    501 
    502 static void
    503 nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jobject jbitmap)
    504 {
    505     SkBitmap const * nativeBitmap =
    506             (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID);
    507     const SkBitmap& bitmap(*nativeBitmap);
    508 
    509     bitmap.lockPixels();
    510     void* ptr = bitmap.getPixels();
    511     rsAllocationCopyToBitmap(con, (RsAllocation)alloc, ptr, bitmap.getSize());
    512     bitmap.unlockPixels();
    513     bitmap.notifyPixelsChanged();
    514 }
    515 
    516 static void ReleaseBitmapCallback(void *bmp)
    517 {
    518     SkBitmap const * nativeBitmap = (SkBitmap const *)bmp;
    519     nativeBitmap->unlockPixels();
    520 }
    521 
    522 
    523 static void
    524 nAllocationData1D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jintArray data, int sizeBytes)
    525 {
    526     jint len = _env->GetArrayLength(data);
    527     LOG_API("nAllocation1DData_i, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
    528     jint *ptr = _env->GetIntArrayElements(data, NULL);
    529     rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
    530     _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
    531 }
    532 
    533 static void
    534 nAllocationData1D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jshortArray data, int sizeBytes)
    535 {
    536     jint len = _env->GetArrayLength(data);
    537     LOG_API("nAllocation1DData_s, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
    538     jshort *ptr = _env->GetShortArrayElements(data, NULL);
    539     rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
    540     _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
    541 }
    542 
    543 static void
    544 nAllocationData1D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jbyteArray data, int sizeBytes)
    545 {
    546     jint len = _env->GetArrayLength(data);
    547     LOG_API("nAllocation1DData_b, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
    548     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    549     rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
    550     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    551 }
    552 
    553 static void
    554 nAllocationData1D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint count, jfloatArray data, int sizeBytes)
    555 {
    556     jint len = _env->GetArrayLength(data);
    557     LOG_API("nAllocation1DData_f, con(%p), adapter(%p), offset(%i), count(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, count, len, sizeBytes);
    558     jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
    559     rsAllocation1DData(con, (RsAllocation)alloc, offset, lod, count, ptr, sizeBytes);
    560     _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
    561 }
    562 
    563 static void
    564 //    native void rsnAllocationElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes);
    565 nAllocationElementData1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint offset, jint lod, jint compIdx, jbyteArray data, int sizeBytes)
    566 {
    567     jint len = _env->GetArrayLength(data);
    568     LOG_API("nAllocationElementData1D, con(%p), alloc(%p), offset(%i), comp(%i), len(%i), sizeBytes(%i)", con, (RsAllocation)alloc, offset, compIdx, len, sizeBytes);
    569     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    570     rsAllocation1DElementData(con, (RsAllocation)alloc, offset, lod, ptr, compIdx, sizeBytes);
    571     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    572 }
    573 
    574 static void
    575 nAllocationData2D_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
    576                     jint w, jint h, jshortArray data, int sizeBytes)
    577 {
    578     jint len = _env->GetArrayLength(data);
    579     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);
    580     jshort *ptr = _env->GetShortArrayElements(data, NULL);
    581     rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
    582     _env->ReleaseShortArrayElements(data, ptr, JNI_ABORT);
    583 }
    584 
    585 static void
    586 nAllocationData2D_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
    587                     jint w, jint h, jbyteArray data, int sizeBytes)
    588 {
    589     jint len = _env->GetArrayLength(data);
    590     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);
    591     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    592     rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
    593     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    594 }
    595 
    596 static void
    597 nAllocationData2D_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
    598                     jint w, jint h, jintArray data, int sizeBytes)
    599 {
    600     jint len = _env->GetArrayLength(data);
    601     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);
    602     jint *ptr = _env->GetIntArrayElements(data, NULL);
    603     rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
    604     _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT);
    605 }
    606 
    607 static void
    608 nAllocationData2D_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint xoff, jint yoff, jint lod, jint face,
    609                     jint w, jint h, jfloatArray data, int sizeBytes)
    610 {
    611     jint len = _env->GetArrayLength(data);
    612     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);
    613     jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
    614     rsAllocation2DData(con, (RsAllocation)alloc, xoff, yoff, lod, (RsAllocationCubemapFace)face, w, h, ptr, sizeBytes);
    615     _env->ReleaseFloatArrayElements(data, ptr, JNI_ABORT);
    616 }
    617 
    618 static void
    619 nAllocationData2D_alloc(JNIEnv *_env, jobject _this, RsContext con,
    620                         jint dstAlloc, jint dstXoff, jint dstYoff,
    621                         jint dstMip, jint dstFace,
    622                         jint width, jint height,
    623                         jint srcAlloc, jint srcXoff, jint srcYoff,
    624                         jint srcMip, jint srcFace)
    625 {
    626     LOG_API("nAllocation2DData_s, con(%p), dstAlloc(%p), dstXoff, dstYoff,"
    627             " dstMip(%i), dstFace(%i), width(%i), height(%i),"
    628             " srcAlloc(%p), srcXoff(%i), srcYoff(%i), srcMip(%i), srcFace(%i)",
    629             con, (RsAllocation)dstAlloc, dstXoff, dstYoff, dstMip, dstFace,
    630             width, height, (RsAllocation)srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
    631 
    632     rsAllocationCopy2DRange(con,
    633                             (RsAllocation)dstAlloc,
    634                             dstXoff, dstYoff,
    635                             dstMip, dstFace,
    636                             width, height,
    637                             (RsAllocation)srcAlloc,
    638                             srcXoff, srcYoff,
    639                             srcMip, srcFace);
    640 }
    641 
    642 static void
    643 nAllocationRead_i(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jintArray data)
    644 {
    645     jint len = _env->GetArrayLength(data);
    646     LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
    647     jint *ptr = _env->GetIntArrayElements(data, NULL);
    648     jsize length = _env->GetArrayLength(data);
    649     rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
    650     _env->ReleaseIntArrayElements(data, ptr, 0);
    651 }
    652 
    653 static void
    654 nAllocationRead_s(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jshortArray data)
    655 {
    656     jint len = _env->GetArrayLength(data);
    657     LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
    658     jshort *ptr = _env->GetShortArrayElements(data, NULL);
    659     jsize length = _env->GetArrayLength(data);
    660     rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
    661     _env->ReleaseShortArrayElements(data, ptr, 0);
    662 }
    663 
    664 static void
    665 nAllocationRead_b(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jbyteArray data)
    666 {
    667     jint len = _env->GetArrayLength(data);
    668     LOG_API("nAllocationRead_i, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
    669     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    670     jsize length = _env->GetArrayLength(data);
    671     rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
    672     _env->ReleaseByteArrayElements(data, ptr, 0);
    673 }
    674 
    675 static void
    676 nAllocationRead_f(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jfloatArray data)
    677 {
    678     jint len = _env->GetArrayLength(data);
    679     LOG_API("nAllocationRead_f, con(%p), alloc(%p), len(%i)", con, (RsAllocation)alloc, len);
    680     jfloat *ptr = _env->GetFloatArrayElements(data, NULL);
    681     jsize length = _env->GetArrayLength(data);
    682     rsAllocationRead(con, (RsAllocation)alloc, ptr, length);
    683     _env->ReleaseFloatArrayElements(data, ptr, 0);
    684 }
    685 
    686 static jint
    687 nAllocationGetType(JNIEnv *_env, jobject _this, RsContext con, jint a)
    688 {
    689     LOG_API("nAllocationGetType, con(%p), a(%p)", con, (RsAllocation)a);
    690     return (jint) rsaAllocationGetType(con, (RsAllocation)a);
    691 }
    692 
    693 static void
    694 nAllocationResize1D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX)
    695 {
    696     LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i)", con, (RsAllocation)alloc, dimX);
    697     rsAllocationResize1D(con, (RsAllocation)alloc, dimX);
    698 }
    699 
    700 static void
    701 nAllocationResize2D(JNIEnv *_env, jobject _this, RsContext con, jint alloc, jint dimX, jint dimY)
    702 {
    703     LOG_API("nAllocationResize1D, con(%p), alloc(%p), sizeX(%i), sizeY(%i)", con, (RsAllocation)alloc, dimX, dimY);
    704     rsAllocationResize2D(con, (RsAllocation)alloc, dimX, dimY);
    705 }
    706 
    707 // -----------------------------------
    708 
    709 static int
    710 nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, jint native_asset)
    711 {
    712     LOGV("______nFileA3D %u", (uint32_t) native_asset);
    713 
    714     Asset* asset = reinterpret_cast<Asset*>(native_asset);
    715 
    716     jint id = (jint)rsaFileA3DCreateFromMemory(con, asset->getBuffer(false), asset->getLength());
    717     return id;
    718 }
    719 
    720 static int
    721 nFileA3DCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path)
    722 {
    723     AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
    724     if (mgr == NULL) {
    725         return 0;
    726     }
    727 
    728     AutoJavaStringToUTF8 str(_env, _path);
    729     Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
    730     if (asset == NULL) {
    731         return 0;
    732     }
    733 
    734     jint id = (jint)rsaFileA3DCreateFromAsset(con, asset);
    735     return id;
    736 }
    737 
    738 static int
    739 nFileA3DCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, jstring fileName)
    740 {
    741     AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
    742     jint id = (jint)rsaFileA3DCreateFromFile(con, fileNameUTF.c_str());
    743 
    744     return id;
    745 }
    746 
    747 static int
    748 nFileA3DGetNumIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D)
    749 {
    750     int32_t numEntries = 0;
    751     rsaFileA3DGetNumIndexEntries(con, &numEntries, (RsFile)fileA3D);
    752     return numEntries;
    753 }
    754 
    755 static void
    756 nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
    757 {
    758     LOGV("______nFileA3D %u", (uint32_t) fileA3D);
    759     RsFileIndexEntry *fileEntries = (RsFileIndexEntry*)malloc((uint32_t)numEntries * sizeof(RsFileIndexEntry));
    760 
    761     rsaFileA3DGetIndexEntries(con, fileEntries, (uint32_t)numEntries, (RsFile)fileA3D);
    762 
    763     for(jint i = 0; i < numEntries; i ++) {
    764         _env->SetObjectArrayElement(_entries, i, _env->NewStringUTF(fileEntries[i].objectName));
    765         _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&fileEntries[i].classID);
    766     }
    767 
    768     free(fileEntries);
    769 }
    770 
    771 static int
    772 nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint index)
    773 {
    774     LOGV("______nFileA3D %u", (uint32_t) fileA3D);
    775     jint id = (jint)rsaFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D);
    776     return id;
    777 }
    778 
    779 // -----------------------------------
    780 
    781 static int
    782 nFontCreateFromFile(JNIEnv *_env, jobject _this, RsContext con,
    783                     jstring fileName, jfloat fontSize, jint dpi)
    784 {
    785     AutoJavaStringToUTF8 fileNameUTF(_env, fileName);
    786     jint id = (jint)rsFontCreateFromFile(con,
    787                                          fileNameUTF.c_str(), fileNameUTF.length(),
    788                                          fontSize, dpi);
    789 
    790     return id;
    791 }
    792 
    793 static int
    794 nFontCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con,
    795                            jstring name, jfloat fontSize, jint dpi, jint native_asset)
    796 {
    797     Asset* asset = reinterpret_cast<Asset*>(native_asset);
    798     AutoJavaStringToUTF8 nameUTF(_env, name);
    799 
    800     jint id = (jint)rsFontCreateFromMemory(con,
    801                                            nameUTF.c_str(), nameUTF.length(),
    802                                            fontSize, dpi,
    803                                            asset->getBuffer(false), asset->getLength());
    804     return id;
    805 }
    806 
    807 static int
    808 nFontCreateFromAsset(JNIEnv *_env, jobject _this, RsContext con, jobject _assetMgr, jstring _path,
    809                      jfloat fontSize, jint dpi)
    810 {
    811     AssetManager* mgr = assetManagerForJavaObject(_env, _assetMgr);
    812     if (mgr == NULL) {
    813         return 0;
    814     }
    815 
    816     AutoJavaStringToUTF8 str(_env, _path);
    817     Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
    818     if (asset == NULL) {
    819         return 0;
    820     }
    821 
    822     jint id = (jint)rsFontCreateFromMemory(con,
    823                                            str.c_str(), str.length(),
    824                                            fontSize, dpi,
    825                                            asset->getBuffer(false), asset->getLength());
    826     delete asset;
    827     return id;
    828 }
    829 
    830 // -----------------------------------
    831 
    832 static void
    833 nScriptBindAllocation(JNIEnv *_env, jobject _this, RsContext con, jint script, jint alloc, jint slot)
    834 {
    835     LOG_API("nScriptBindAllocation, con(%p), script(%p), alloc(%p), slot(%i)", con, (RsScript)script, (RsAllocation)alloc, slot);
    836     rsScriptBindAllocation(con, (RsScript)script, (RsAllocation)alloc, slot);
    837 }
    838 
    839 static void
    840 nScriptSetVarI(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
    841 {
    842     LOG_API("nScriptSetVarI, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
    843     rsScriptSetVarI(con, (RsScript)script, slot, val);
    844 }
    845 
    846 static void
    847 nScriptSetVarObj(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val)
    848 {
    849     LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val);
    850     rsScriptSetVarObj(con, (RsScript)script, slot, (RsObjectBase)val);
    851 }
    852 
    853 static void
    854 nScriptSetVarJ(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jlong val)
    855 {
    856     LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", con, (void *)script, slot, val);
    857     rsScriptSetVarJ(con, (RsScript)script, slot, val);
    858 }
    859 
    860 static void
    861 nScriptSetVarF(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, float val)
    862 {
    863     LOG_API("nScriptSetVarF, con(%p), s(%p), slot(%i), val(%f)", con, (void *)script, slot, val);
    864     rsScriptSetVarF(con, (RsScript)script, slot, val);
    865 }
    866 
    867 static void
    868 nScriptSetVarD(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, double val)
    869 {
    870     LOG_API("nScriptSetVarD, con(%p), s(%p), slot(%i), val(%lf)", con, (void *)script, slot, val);
    871     rsScriptSetVarD(con, (RsScript)script, slot, val);
    872 }
    873 
    874 static void
    875 nScriptSetVarV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data)
    876 {
    877     LOG_API("nScriptSetVarV, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
    878     jint len = _env->GetArrayLength(data);
    879     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    880     rsScriptSetVarV(con, (RsScript)script, slot, ptr, len);
    881     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    882 }
    883 
    884 
    885 static void
    886 nScriptSetTimeZone(JNIEnv *_env, jobject _this, RsContext con, jint script, jbyteArray timeZone)
    887 {
    888     LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", con, (void *)script, (const char *)timeZone);
    889 
    890     jint length = _env->GetArrayLength(timeZone);
    891     jbyte* timeZone_ptr;
    892     timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
    893 
    894     rsScriptSetTimeZone(con, (RsScript)script, (const char *)timeZone_ptr, length);
    895 
    896     if (timeZone_ptr) {
    897         _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
    898     }
    899 }
    900 
    901 static void
    902 nScriptInvoke(JNIEnv *_env, jobject _this, RsContext con, jint obj, jint slot)
    903 {
    904     LOG_API("nScriptInvoke, con(%p), script(%p)", con, (void *)obj);
    905     rsScriptInvoke(con, (RsScript)obj, slot);
    906 }
    907 
    908 static void
    909 nScriptInvokeV(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jbyteArray data)
    910 {
    911     LOG_API("nScriptInvokeV, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
    912     jint len = _env->GetArrayLength(data);
    913     jbyte *ptr = _env->GetByteArrayElements(data, NULL);
    914     rsScriptInvokeV(con, (RsScript)script, slot, ptr, len);
    915     _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
    916 }
    917 
    918 static void
    919 nScriptForEach(JNIEnv *_env, jobject _this, RsContext con,
    920                jint script, jint slot, jint ain, jint aout)
    921 {
    922     LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
    923     rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, NULL, 0);
    924 }
    925 static void
    926 nScriptForEachV(JNIEnv *_env, jobject _this, RsContext con,
    927                 jint script, jint slot, jint ain, jint aout, jbyteArray params)
    928 {
    929     LOG_API("nScriptForEach, con(%p), s(%p), slot(%i)", con, (void *)script, slot);
    930     jint len = _env->GetArrayLength(params);
    931     jbyte *ptr = _env->GetByteArrayElements(params, NULL);
    932     rsScriptForEach(con, (RsScript)script, slot, (RsAllocation)ain, (RsAllocation)aout, ptr, len);
    933     _env->ReleaseByteArrayElements(params, ptr, JNI_ABORT);
    934 }
    935 
    936 
    937 // -----------------------------------
    938 
    939 static jint
    940 nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con,
    941                jstring resName, jstring cacheDir,
    942                jbyteArray scriptRef, jint length)
    943 {
    944     LOG_API("nScriptCCreate, con(%p)", con);
    945 
    946     AutoJavaStringToUTF8 resNameUTF(_env, resName);
    947     AutoJavaStringToUTF8 cacheDirUTF(_env, cacheDir);
    948     jint ret = 0;
    949     jbyte* script_ptr = NULL;
    950     jint _exception = 0;
    951     jint remaining;
    952     if (!scriptRef) {
    953         _exception = 1;
    954         //jniThrowException(_env, "java/lang/IllegalArgumentException", "script == null");
    955         goto exit;
    956     }
    957     if (length < 0) {
    958         _exception = 1;
    959         //jniThrowException(_env, "java/lang/IllegalArgumentException", "length < 0");
    960         goto exit;
    961     }
    962     remaining = _env->GetArrayLength(scriptRef);
    963     if (remaining < length) {
    964         _exception = 1;
    965         //jniThrowException(_env, "java/lang/IllegalArgumentException",
    966         //        "length > script.length - offset");
    967         goto exit;
    968     }
    969     script_ptr = (jbyte *)
    970         _env->GetPrimitiveArrayCritical(scriptRef, (jboolean *)0);
    971 
    972     //rsScriptCSetText(con, (const char *)script_ptr, length);
    973 
    974     ret = (jint)rsScriptCCreate(con,
    975                                 resNameUTF.c_str(), resNameUTF.length(),
    976                                 cacheDirUTF.c_str(), cacheDirUTF.length(),
    977                                 (const char *)script_ptr, length);
    978 
    979 exit:
    980     if (script_ptr) {
    981         _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
    982                 _exception ? JNI_ABORT: 0);
    983     }
    984 
    985     return ret;
    986 }
    987 
    988 // ---------------------------------------------------------------------------
    989 
    990 static jint
    991 nProgramStoreCreate(JNIEnv *_env, jobject _this, RsContext con,
    992                     jboolean colorMaskR, jboolean colorMaskG, jboolean colorMaskB, jboolean colorMaskA,
    993                     jboolean depthMask, jboolean ditherEnable,
    994                     jint srcFunc, jint destFunc,
    995                     jint depthFunc)
    996 {
    997     LOG_API("nProgramStoreCreate, con(%p)", con);
    998     return (jint)rsProgramStoreCreate(con, colorMaskR, colorMaskG, colorMaskB, colorMaskA,
    999                                       depthMask, ditherEnable, (RsBlendSrcFunc)srcFunc,
   1000                                       (RsBlendDstFunc)destFunc, (RsDepthFunc)depthFunc);
   1001 }
   1002 
   1003 // ---------------------------------------------------------------------------
   1004 
   1005 static void
   1006 nProgramBindConstants(JNIEnv *_env, jobject _this, RsContext con, jint vpv, jint slot, jint a)
   1007 {
   1008     LOG_API("nProgramBindConstants, con(%p), vpf(%p), sloat(%i), a(%p)", con, (RsProgramVertex)vpv, slot, (RsAllocation)a);
   1009     rsProgramBindConstants(con, (RsProgram)vpv, slot, (RsAllocation)a);
   1010 }
   1011 
   1012 static void
   1013 nProgramBindTexture(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a)
   1014 {
   1015     LOG_API("nProgramBindTexture, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
   1016     rsProgramBindTexture(con, (RsProgramFragment)vpf, slot, (RsAllocation)a);
   1017 }
   1018 
   1019 static void
   1020 nProgramBindSampler(JNIEnv *_env, jobject _this, RsContext con, jint vpf, jint slot, jint a)
   1021 {
   1022     LOG_API("nProgramBindSampler, con(%p), vpf(%p), slot(%i), a(%p)", con, (RsProgramFragment)vpf, slot, (RsSampler)a);
   1023     rsProgramBindSampler(con, (RsProgramFragment)vpf, slot, (RsSampler)a);
   1024 }
   1025 
   1026 // ---------------------------------------------------------------------------
   1027 
   1028 static jint
   1029 nProgramFragmentCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader, jintArray params)
   1030 {
   1031     AutoJavaStringToUTF8 shaderUTF(_env, shader);
   1032     jint *paramPtr = _env->GetIntArrayElements(params, NULL);
   1033     jint paramLen = _env->GetArrayLength(params);
   1034 
   1035     LOG_API("nProgramFragmentCreate, con(%p), paramLen(%i)", con, paramLen);
   1036 
   1037     jint ret = (jint)rsProgramFragmentCreate(con, shaderUTF.c_str(), shaderUTF.length(), (uint32_t *)paramPtr, paramLen);
   1038     _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
   1039     return ret;
   1040 }
   1041 
   1042 
   1043 // ---------------------------------------------------------------------------
   1044 
   1045 static jint
   1046 nProgramVertexCreate(JNIEnv *_env, jobject _this, RsContext con, jstring shader, jintArray params)
   1047 {
   1048     AutoJavaStringToUTF8 shaderUTF(_env, shader);
   1049     jint *paramPtr = _env->GetIntArrayElements(params, NULL);
   1050     jint paramLen = _env->GetArrayLength(params);
   1051 
   1052     LOG_API("nProgramVertexCreate, con(%p), paramLen(%i)", con, paramLen);
   1053 
   1054     jint ret = (jint)rsProgramVertexCreate(con, shaderUTF.c_str(), shaderUTF.length(), (uint32_t *)paramPtr, paramLen);
   1055     _env->ReleaseIntArrayElements(params, paramPtr, JNI_ABORT);
   1056     return ret;
   1057 }
   1058 
   1059 // ---------------------------------------------------------------------------
   1060 
   1061 static jint
   1062 nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSprite, jint cull)
   1063 {
   1064     LOG_API("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", con, pointSprite, cull);
   1065     return (jint)rsProgramRasterCreate(con, pointSprite, (RsCullMode)cull);
   1066 }
   1067 
   1068 
   1069 // ---------------------------------------------------------------------------
   1070 
   1071 static void
   1072 nContextBindRootScript(JNIEnv *_env, jobject _this, RsContext con, jint script)
   1073 {
   1074     LOG_API("nContextBindRootScript, con(%p), script(%p)", con, (RsScript)script);
   1075     rsContextBindRootScript(con, (RsScript)script);
   1076 }
   1077 
   1078 static void
   1079 nContextBindProgramStore(JNIEnv *_env, jobject _this, RsContext con, jint pfs)
   1080 {
   1081     LOG_API("nContextBindProgramStore, con(%p), pfs(%p)", con, (RsProgramStore)pfs);
   1082     rsContextBindProgramStore(con, (RsProgramStore)pfs);
   1083 }
   1084 
   1085 static void
   1086 nContextBindProgramFragment(JNIEnv *_env, jobject _this, RsContext con, jint pf)
   1087 {
   1088     LOG_API("nContextBindProgramFragment, con(%p), pf(%p)", con, (RsProgramFragment)pf);
   1089     rsContextBindProgramFragment(con, (RsProgramFragment)pf);
   1090 }
   1091 
   1092 static void
   1093 nContextBindProgramVertex(JNIEnv *_env, jobject _this, RsContext con, jint pf)
   1094 {
   1095     LOG_API("nContextBindProgramVertex, con(%p), pf(%p)", con, (RsProgramVertex)pf);
   1096     rsContextBindProgramVertex(con, (RsProgramVertex)pf);
   1097 }
   1098 
   1099 static void
   1100 nContextBindProgramRaster(JNIEnv *_env, jobject _this, RsContext con, jint pf)
   1101 {
   1102     LOG_API("nContextBindProgramRaster, con(%p), pf(%p)", con, (RsProgramRaster)pf);
   1103     rsContextBindProgramRaster(con, (RsProgramRaster)pf);
   1104 }
   1105 
   1106 
   1107 // ---------------------------------------------------------------------------
   1108 
   1109 static jint
   1110 nSamplerCreate(JNIEnv *_env, jobject _this, RsContext con, jint magFilter, jint minFilter,
   1111                jint wrapS, jint wrapT, jint wrapR, jfloat aniso)
   1112 {
   1113     LOG_API("nSamplerCreate, con(%p)", con);
   1114     return (jint)rsSamplerCreate(con,
   1115                                  (RsSamplerValue)magFilter,
   1116                                  (RsSamplerValue)minFilter,
   1117                                  (RsSamplerValue)wrapS,
   1118                                  (RsSamplerValue)wrapT,
   1119                                  (RsSamplerValue)wrapR,
   1120                                  aniso);
   1121 }
   1122 
   1123 // ---------------------------------------------------------------------------
   1124 
   1125 static jint
   1126 nMeshCreate(JNIEnv *_env, jobject _this, RsContext con, jintArray _vtx, jintArray _idx, jintArray _prim)
   1127 {
   1128     LOG_API("nMeshCreate, con(%p)", con);
   1129 
   1130     jint vtxLen = _env->GetArrayLength(_vtx);
   1131     jint *vtxPtr = _env->GetIntArrayElements(_vtx, NULL);
   1132     jint idxLen = _env->GetArrayLength(_idx);
   1133     jint *idxPtr = _env->GetIntArrayElements(_idx, NULL);
   1134     jint primLen = _env->GetArrayLength(_prim);
   1135     jint *primPtr = _env->GetIntArrayElements(_prim, NULL);
   1136 
   1137     int id = (int)rsMeshCreate(con,
   1138                                (RsAllocation *)vtxPtr, vtxLen,
   1139                                (RsAllocation *)idxPtr, idxLen,
   1140                                (uint32_t *)primPtr, primLen);
   1141 
   1142     _env->ReleaseIntArrayElements(_vtx, vtxPtr, 0);
   1143     _env->ReleaseIntArrayElements(_idx, idxPtr, 0);
   1144     _env->ReleaseIntArrayElements(_prim, primPtr, 0);
   1145     return id;
   1146 }
   1147 
   1148 static jint
   1149 nMeshGetVertexBufferCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh)
   1150 {
   1151     LOG_API("nMeshGetVertexBufferCount, con(%p), Mesh(%p)", con, (RsMesh)mesh);
   1152     jint vtxCount = 0;
   1153     rsaMeshGetVertexBufferCount(con, (RsMesh)mesh, &vtxCount);
   1154     return vtxCount;
   1155 }
   1156 
   1157 static jint
   1158 nMeshGetIndexCount(JNIEnv *_env, jobject _this, RsContext con, jint mesh)
   1159 {
   1160     LOG_API("nMeshGetIndexCount, con(%p), Mesh(%p)", con, (RsMesh)mesh);
   1161     jint idxCount = 0;
   1162     rsaMeshGetIndexCount(con, (RsMesh)mesh, &idxCount);
   1163     return idxCount;
   1164 }
   1165 
   1166 static void
   1167 nMeshGetVertices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _ids, int numVtxIDs)
   1168 {
   1169     LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh);
   1170 
   1171     RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numVtxIDs * sizeof(RsAllocation));
   1172     rsaMeshGetVertices(con, (RsMesh)mesh, allocs, (uint32_t)numVtxIDs);
   1173 
   1174     for(jint i = 0; i < numVtxIDs; i ++) {
   1175         _env->SetIntArrayRegion(_ids, i, 1, (const jint*)&allocs[i]);
   1176     }
   1177 
   1178     free(allocs);
   1179 }
   1180 
   1181 static void
   1182 nMeshGetIndices(JNIEnv *_env, jobject _this, RsContext con, jint mesh, jintArray _idxIds, jintArray _primitives, int numIndices)
   1183 {
   1184     LOG_API("nMeshGetVertices, con(%p), Mesh(%p)", con, (RsMesh)mesh);
   1185 
   1186     RsAllocation *allocs = (RsAllocation*)malloc((uint32_t)numIndices * sizeof(RsAllocation));
   1187     uint32_t *prims= (uint32_t*)malloc((uint32_t)numIndices * sizeof(uint32_t));
   1188 
   1189     rsaMeshGetIndices(con, (RsMesh)mesh, allocs, prims, (uint32_t)numIndices);
   1190 
   1191     for(jint i = 0; i < numIndices; i ++) {
   1192         _env->SetIntArrayRegion(_idxIds, i, 1, (const jint*)&allocs[i]);
   1193         _env->SetIntArrayRegion(_primitives, i, 1, (const jint*)&prims[i]);
   1194     }
   1195 
   1196     free(allocs);
   1197     free(prims);
   1198 }
   1199 
   1200 // ---------------------------------------------------------------------------
   1201 
   1202 
   1203 static const char *classPathName = "android/renderscript/RenderScript";
   1204 
   1205 static JNINativeMethod methods[] = {
   1206 {"_nInit",                         "()V",                                     (void*)_nInit },
   1207 
   1208 {"nDeviceCreate",                  "()I",                                     (void*)nDeviceCreate },
   1209 {"nDeviceDestroy",                 "(I)V",                                    (void*)nDeviceDestroy },
   1210 {"nDeviceSetConfig",               "(III)V",                                  (void*)nDeviceSetConfig },
   1211 {"nContextGetUserMessage",         "(I[I)I",                                  (void*)nContextGetUserMessage },
   1212 {"nContextGetErrorMessage",        "(I)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
   1213 {"nContextPeekMessage",            "(I[I)I",                                  (void*)nContextPeekMessage },
   1214 
   1215 {"nContextInitToClient",           "(I)V",                                    (void*)nContextInitToClient },
   1216 {"nContextDeinitToClient",         "(I)V",                                    (void*)nContextDeinitToClient },
   1217 
   1218 
   1219 // All methods below are thread protected in java.
   1220 {"rsnContextCreate",                 "(III)I",                                (void*)nContextCreate },
   1221 {"rsnContextCreateGL",               "(IIIIIIIIIIIIIFI)I",                    (void*)nContextCreateGL },
   1222 {"rsnContextFinish",                 "(I)V",                                  (void*)nContextFinish },
   1223 {"rsnContextSetPriority",            "(II)V",                                 (void*)nContextSetPriority },
   1224 {"rsnContextSetSurface",             "(IIILandroid/view/Surface;)V",          (void*)nContextSetSurface },
   1225 {"rsnContextSetSurfaceTexture",      "(IIILandroid/graphics/SurfaceTexture;)V", (void*)nContextSetSurfaceTexture },
   1226 {"rsnContextDestroy",                "(I)V",                                  (void*)nContextDestroy },
   1227 {"rsnContextDump",                   "(II)V",                                 (void*)nContextDump },
   1228 {"rsnContextPause",                  "(I)V",                                  (void*)nContextPause },
   1229 {"rsnContextResume",                 "(I)V",                                  (void*)nContextResume },
   1230 {"rsnAssignName",                    "(II[B)V",                               (void*)nAssignName },
   1231 {"rsnGetName",                       "(II)Ljava/lang/String;",                (void*)nGetName },
   1232 {"rsnObjDestroy",                    "(II)V",                                 (void*)nObjDestroy },
   1233 
   1234 {"rsnFileA3DCreateFromFile",         "(ILjava/lang/String;)I",                (void*)nFileA3DCreateFromFile },
   1235 {"rsnFileA3DCreateFromAssetStream",  "(II)I",                                 (void*)nFileA3DCreateFromAssetStream },
   1236 {"rsnFileA3DCreateFromAsset",        "(ILandroid/content/res/AssetManager;Ljava/lang/String;)I",            (void*)nFileA3DCreateFromAsset },
   1237 {"rsnFileA3DGetNumIndexEntries",     "(II)I",                                 (void*)nFileA3DGetNumIndexEntries },
   1238 {"rsnFileA3DGetIndexEntries",        "(III[I[Ljava/lang/String;)V",           (void*)nFileA3DGetIndexEntries },
   1239 {"rsnFileA3DGetEntryByIndex",        "(III)I",                                (void*)nFileA3DGetEntryByIndex },
   1240 
   1241 {"rsnFontCreateFromFile",            "(ILjava/lang/String;FI)I",              (void*)nFontCreateFromFile },
   1242 {"rsnFontCreateFromAssetStream",     "(ILjava/lang/String;FII)I",             (void*)nFontCreateFromAssetStream },
   1243 {"rsnFontCreateFromAsset",        "(ILandroid/content/res/AssetManager;Ljava/lang/String;FI)I",            (void*)nFontCreateFromAsset },
   1244 
   1245 {"rsnElementCreate",                 "(IIIZI)I",                              (void*)nElementCreate },
   1246 {"rsnElementCreate2",                "(I[I[Ljava/lang/String;[I)I",           (void*)nElementCreate2 },
   1247 {"rsnElementGetNativeData",          "(II[I)V",                               (void*)nElementGetNativeData },
   1248 {"rsnElementGetSubElements",         "(II[I[Ljava/lang/String;[I)V",          (void*)nElementGetSubElements },
   1249 
   1250 {"rsnTypeCreate",                    "(IIIIIZZ)I",                            (void*)nTypeCreate },
   1251 {"rsnTypeGetNativeData",             "(II[I)V",                               (void*)nTypeGetNativeData },
   1252 
   1253 {"rsnAllocationCreateTyped",         "(IIII)I",                               (void*)nAllocationCreateTyped },
   1254 {"rsnAllocationCreateFromBitmap",    "(IIILandroid/graphics/Bitmap;I)I",      (void*)nAllocationCreateFromBitmap },
   1255 {"rsnAllocationCubeCreateFromBitmap","(IIILandroid/graphics/Bitmap;I)I",      (void*)nAllocationCubeCreateFromBitmap },
   1256 
   1257 {"rsnAllocationCopyFromBitmap",      "(IILandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyFromBitmap },
   1258 {"rsnAllocationCopyToBitmap",        "(IILandroid/graphics/Bitmap;)V",        (void*)nAllocationCopyToBitmap },
   1259 
   1260 {"rsnAllocationSyncAll",             "(III)V",                                (void*)nAllocationSyncAll },
   1261 {"rsnAllocationData1D",              "(IIIII[II)V",                           (void*)nAllocationData1D_i },
   1262 {"rsnAllocationData1D",              "(IIIII[SI)V",                           (void*)nAllocationData1D_s },
   1263 {"rsnAllocationData1D",              "(IIIII[BI)V",                           (void*)nAllocationData1D_b },
   1264 {"rsnAllocationData1D",              "(IIIII[FI)V",                           (void*)nAllocationData1D_f },
   1265 {"rsnAllocationElementData1D",       "(IIIII[BI)V",                           (void*)nAllocationElementData1D },
   1266 {"rsnAllocationData2D",              "(IIIIIIII[II)V",                        (void*)nAllocationData2D_i },
   1267 {"rsnAllocationData2D",              "(IIIIIIII[SI)V",                        (void*)nAllocationData2D_s },
   1268 {"rsnAllocationData2D",              "(IIIIIIII[BI)V",                        (void*)nAllocationData2D_b },
   1269 {"rsnAllocationData2D",              "(IIIIIIII[FI)V",                        (void*)nAllocationData2D_f },
   1270 {"rsnAllocationData2D",              "(IIIIIIIIIIIII)V",                      (void*)nAllocationData2D_alloc },
   1271 {"rsnAllocationRead",                "(II[I)V",                               (void*)nAllocationRead_i },
   1272 {"rsnAllocationRead",                "(II[S)V",                               (void*)nAllocationRead_s },
   1273 {"rsnAllocationRead",                "(II[B)V",                               (void*)nAllocationRead_b },
   1274 {"rsnAllocationRead",                "(II[F)V",                               (void*)nAllocationRead_f },
   1275 {"rsnAllocationGetType",             "(II)I",                                 (void*)nAllocationGetType},
   1276 {"rsnAllocationResize1D",            "(III)V",                                (void*)nAllocationResize1D },
   1277 {"rsnAllocationResize2D",            "(IIII)V",                               (void*)nAllocationResize2D },
   1278 {"rsnAllocationGenerateMipmaps",     "(II)V",                                 (void*)nAllocationGenerateMipmaps },
   1279 
   1280 {"rsnScriptBindAllocation",          "(IIII)V",                               (void*)nScriptBindAllocation },
   1281 {"rsnScriptSetTimeZone",             "(II[B)V",                               (void*)nScriptSetTimeZone },
   1282 {"rsnScriptInvoke",                  "(III)V",                                (void*)nScriptInvoke },
   1283 {"rsnScriptInvokeV",                 "(III[B)V",                              (void*)nScriptInvokeV },
   1284 {"rsnScriptForEach",                 "(IIIII)V",                              (void*)nScriptForEach },
   1285 {"rsnScriptForEach",                 "(IIIII[B)V",                            (void*)nScriptForEachV },
   1286 {"rsnScriptSetVarI",                 "(IIII)V",                               (void*)nScriptSetVarI },
   1287 {"rsnScriptSetVarJ",                 "(IIIJ)V",                               (void*)nScriptSetVarJ },
   1288 {"rsnScriptSetVarF",                 "(IIIF)V",                               (void*)nScriptSetVarF },
   1289 {"rsnScriptSetVarD",                 "(IIID)V",                               (void*)nScriptSetVarD },
   1290 {"rsnScriptSetVarV",                 "(III[B)V",                              (void*)nScriptSetVarV },
   1291 {"rsnScriptSetVarObj",               "(IIII)V",                               (void*)nScriptSetVarObj },
   1292 
   1293 {"rsnScriptCCreate",                 "(ILjava/lang/String;Ljava/lang/String;[BI)I",  (void*)nScriptCCreate },
   1294 
   1295 {"rsnProgramStoreCreate",            "(IZZZZZZIII)I",                         (void*)nProgramStoreCreate },
   1296 
   1297 {"rsnProgramBindConstants",          "(IIII)V",                               (void*)nProgramBindConstants },
   1298 {"rsnProgramBindTexture",            "(IIII)V",                               (void*)nProgramBindTexture },
   1299 {"rsnProgramBindSampler",            "(IIII)V",                               (void*)nProgramBindSampler },
   1300 
   1301 {"rsnProgramFragmentCreate",         "(ILjava/lang/String;[I)I",              (void*)nProgramFragmentCreate },
   1302 {"rsnProgramRasterCreate",           "(IZI)I",                                (void*)nProgramRasterCreate },
   1303 {"rsnProgramVertexCreate",           "(ILjava/lang/String;[I)I",              (void*)nProgramVertexCreate },
   1304 
   1305 {"rsnContextBindRootScript",         "(II)V",                                 (void*)nContextBindRootScript },
   1306 {"rsnContextBindProgramStore",       "(II)V",                                 (void*)nContextBindProgramStore },
   1307 {"rsnContextBindProgramFragment",    "(II)V",                                 (void*)nContextBindProgramFragment },
   1308 {"rsnContextBindProgramVertex",      "(II)V",                                 (void*)nContextBindProgramVertex },
   1309 {"rsnContextBindProgramRaster",      "(II)V",                                 (void*)nContextBindProgramRaster },
   1310 
   1311 {"rsnSamplerCreate",                 "(IIIIIIF)I",                            (void*)nSamplerCreate },
   1312 
   1313 {"rsnMeshCreate",                    "(I[I[I[I)I",                            (void*)nMeshCreate },
   1314 
   1315 {"rsnMeshGetVertexBufferCount",      "(II)I",                                 (void*)nMeshGetVertexBufferCount },
   1316 {"rsnMeshGetIndexCount",             "(II)I",                                 (void*)nMeshGetIndexCount },
   1317 {"rsnMeshGetVertices",               "(II[II)V",                              (void*)nMeshGetVertices },
   1318 {"rsnMeshGetIndices",                "(II[I[II)V",                            (void*)nMeshGetIndices },
   1319 
   1320 };
   1321 
   1322 static int registerFuncs(JNIEnv *_env)
   1323 {
   1324     return android::AndroidRuntime::registerNativeMethods(
   1325             _env, classPathName, methods, NELEM(methods));
   1326 }
   1327 
   1328 // ---------------------------------------------------------------------------
   1329 
   1330 jint JNI_OnLoad(JavaVM* vm, void* reserved)
   1331 {
   1332     JNIEnv* env = NULL;
   1333     jint result = -1;
   1334 
   1335     if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
   1336         LOGE("ERROR: GetEnv failed\n");
   1337         goto bail;
   1338     }
   1339     assert(env != NULL);
   1340 
   1341     if (registerFuncs(env) < 0) {
   1342         LOGE("ERROR: MediaPlayer native registration failed\n");
   1343         goto bail;
   1344     }
   1345 
   1346     /* success -- return valid version number */
   1347     result = JNI_VERSION_1_4;
   1348 
   1349 bail:
   1350     return result;
   1351 }
   1352