android_renderscript_RenderScript.cpp revision 4cbe25a86b4aa3353c8016a129028671e902611f
1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/*
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2011-2012 The Android Open Source Project
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License.
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License.
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define LOG_TAG "libRS_jni"
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h>
20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h>
21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <fcntl.h>
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h>
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <math.h>
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <utils/misc.h>
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <surfaceflinger/Surface.h>
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <core/SkBitmap.h>
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <core/SkPixelRef.h>
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <core/SkStream.h>
31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <core/SkTemplates.h>
32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <images/SkImageDecoder.h>
33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <utils/Asset.h>
35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <utils/AssetManager.h>
36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <utils/ResourceTypes.h>
37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include "jni.h"
39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include "JNIHelp.h"
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include "android_runtime/AndroidRuntime.h"
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include "android_runtime/android_view_Surface.h"
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include "android_runtime/android_util_AssetManager.h"
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <RenderScript.h>
45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <RenderScriptEnv.h>
46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <gui/SurfaceTexture.h>
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <gui/SurfaceTextureClient.h>
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <android_runtime/android_graphics_SurfaceTexture.h>
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project//#define LOG_API ALOGE
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define LOG_API(...)
52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectusing namespace android;
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectclass AutoJavaStringToUTF8 {
56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectpublic:
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str)
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    {
59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        fCStr = env->GetStringUTFChars(str, NULL);
60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        fLength = env->GetStringUTFLength(str);
61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    ~AutoJavaStringToUTF8()
63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    {
64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        fEnv->ReleaseStringUTFChars(fJStr, fCStr);
65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    const char* c_str() const { return fCStr; }
67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    jsize length() const { return fLength; }
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectprivate:
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    JNIEnv*     fEnv;
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    jstring     fJStr;
72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    const char* fCStr;
73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    jsize       fLength;
74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project};
75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project// ---------------------------------------------------------------------------
77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic jfieldID gContextId = 0;
79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic jfieldID gNativeBitmapID = 0;
80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic jfieldID gTypeNativeCache = 0;
81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void _nInit(JNIEnv *_env, jclass _this)
83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    gContextId             = _env->GetFieldID(_this, "mContext", "I");
85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    jclass bitmapClass = _env->FindClass("android/graphics/Bitmap");
87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    gNativeBitmapID = _env->GetFieldID(bitmapClass, "mNativeBitmap", "I");
88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project// ---------------------------------------------------------------------------
91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void
93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source ProjectnContextFinish(JNIEnv *_env, jobject _this, RsContext con)
94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    LOG_API("nContextFinish, con(%p)", con);
96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    rsContextFinish(con);
97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
98
99static void
100nAssignName(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
109static jstring
110nGetName(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
121static void
122nObjDestroy(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
130static jint
131nDeviceCreate(JNIEnv *_env, jobject _this)
132{
133    LOG_API("nDeviceCreate");
134    return (jint)rsDeviceCreate();
135}
136
137static void
138nDeviceDestroy(JNIEnv *_env, jobject _this, jint dev)
139{
140    LOG_API("nDeviceDestroy");
141    return rsDeviceDestroy((RsDevice)dev);
142}
143
144static void
145nDeviceSetConfig(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
151static jint
152nContextCreate(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
158static jint
159nContextCreateGL(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
182static void
183nContextSetPriority(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
191static void
192nContextSetSurface(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
206static void
207nContextSetSurfaceTexture(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
223static void
224nContextDestroy(JNIEnv *_env, jobject _this, RsContext con)
225{
226    LOG_API("nContextDestroy, con(%p)", con);
227    rsContextDestroy(con);
228}
229
230static void
231nContextDump(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
237static void
238nContextPause(JNIEnv *_env, jobject _this, RsContext con)
239{
240    LOG_API("nContextPause, con(%p)", con);
241    rsContextPause(con);
242}
243
244static void
245nContextResume(JNIEnv *_env, jobject _this, RsContext con)
246{
247    LOG_API("nContextResume, con(%p)", con);
248    rsContextResume(con);
249}
250
251
252static jstring
253nContextGetErrorMessage(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        ALOGV("message receive buffer too small.  %i", receiveLen);
266    }
267    return _env->NewStringUTF(buf);
268}
269
270static jint
271nContextGetUserMessage(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        ALOGV("message receive buffer too small.  %i", receiveLen);
284    }
285    _env->ReleaseIntArrayElements(data, ptr, 0);
286    return id;
287}
288
289static jint
290nContextPeekMessage(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
304static void nContextInitToClient(JNIEnv *_env, jobject _this, RsContext con)
305{
306    LOG_API("nContextInitToClient, con(%p)", con);
307    rsContextInitToClient(con);
308}
309
310static void nContextDeinitToClient(JNIEnv *_env, jobject _this, RsContext con)
311{
312    LOG_API("nContextDeinitToClient, con(%p)", con);
313    rsContextDeinitToClient(con);
314}
315
316
317static jint
318nElementCreate(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
324static jint
325nElementCreate2(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
355static void
356nElementGetNativeData(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
373static void
374nElementGetSubElements(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
401static int
402nTypeCreate(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
412static void
413nTypeGetNativeData(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
432static jint
433nAllocationCreateTyped(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
439static void
440nAllocationSyncAll(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
446static void
447nAllocationGenerateMipmaps(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
453static int
454nAllocationCreateFromBitmap(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
469static int
470nAllocationCubeCreateFromBitmap(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
485static void
486nAllocationCopyFromBitmap(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
502static void
503nAllocationCopyToBitmap(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
516static void ReleaseBitmapCallback(void *bmp)
517{
518    SkBitmap const * nativeBitmap = (SkBitmap const *)bmp;
519    nativeBitmap->unlockPixels();
520}
521
522
523static void
524nAllocationData1D_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
533static void
534nAllocationData1D_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
543static void
544nAllocationData1D_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
553static void
554nAllocationData1D_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
563static void
564//    native void rsnAllocationElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes);
565nAllocationElementData1D(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, sizeBytes, compIdx);
571    _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
572}
573
574static void
575nAllocationData2D_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
585static void
586nAllocationData2D_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
596static void
597nAllocationData2D_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
607static void
608nAllocationData2D_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
618static void
619nAllocationData2D_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
642static void
643nAllocationRead_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
653static void
654nAllocationRead_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
664static void
665nAllocationRead_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
675static void
676nAllocationRead_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
686static jint
687nAllocationGetType(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
693static void
694nAllocationResize1D(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
700static void
701nAllocationResize2D(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
709static int
710nFileA3DCreateFromAssetStream(JNIEnv *_env, jobject _this, RsContext con, jint native_asset)
711{
712    ALOGV("______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
720static int
721nFileA3DCreateFromAsset(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
738static int
739nFileA3DCreateFromFile(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
747static int
748nFileA3DGetNumIndexEntries(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
755static void
756nFileA3DGetIndexEntries(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint numEntries, jintArray _ids, jobjectArray _entries)
757{
758    ALOGV("______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
771static int
772nFileA3DGetEntryByIndex(JNIEnv *_env, jobject _this, RsContext con, jint fileA3D, jint index)
773{
774    ALOGV("______nFileA3D %u", (uint32_t) fileA3D);
775    jint id = (jint)rsaFileA3DGetEntryByIndex(con, (uint32_t)index, (RsFile)fileA3D);
776    return id;
777}
778
779// -----------------------------------
780
781static int
782nFontCreateFromFile(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
793static int
794nFontCreateFromAssetStream(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
807static int
808nFontCreateFromAsset(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
832static void
833nScriptBindAllocation(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
839static void
840nScriptSetVarI(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
846static void
847nScriptSetVarObj(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
853static void
854nScriptSetVarJ(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
860static void
861nScriptSetVarF(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
867static void
868nScriptSetVarD(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
874static void
875nScriptSetVarV(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
885static void
886nScriptSetTimeZone(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
901static void
902nScriptInvoke(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
908static void
909nScriptInvokeV(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
918static void
919nScriptForEach(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}
925static void
926nScriptForEachV(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
939static jint
940nScriptCCreate(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
979exit:
980    if (script_ptr) {
981        _env->ReleasePrimitiveArrayCritical(scriptRef, script_ptr,
982                _exception ? JNI_ABORT: 0);
983    }
984
985    return ret;
986}
987
988// ---------------------------------------------------------------------------
989
990static jint
991nProgramStoreCreate(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
1005static void
1006nProgramBindConstants(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
1012static void
1013nProgramBindTexture(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
1019static void
1020nProgramBindSampler(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
1028static jint
1029nProgramFragmentCreate(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
1045static jint
1046nProgramVertexCreate(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
1061static jint
1062nProgramRasterCreate(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
1071static void
1072nContextBindRootScript(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
1078static void
1079nContextBindProgramStore(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
1085static void
1086nContextBindProgramFragment(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
1092static void
1093nContextBindProgramVertex(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
1099static void
1100nContextBindProgramRaster(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
1109static jint
1110nSamplerCreate(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
1125static jint
1126nMeshCreate(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
1148static jint
1149nMeshGetVertexBufferCount(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
1157static jint
1158nMeshGetIndexCount(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
1166static void
1167nMeshGetVertices(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
1181static void
1182nMeshGetIndices(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
1203static const char *classPathName = "android/renderscript/RenderScript";
1204
1205static 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
1322static int registerFuncs(JNIEnv *_env)
1323{
1324    return android::AndroidRuntime::registerNativeMethods(
1325            _env, classPathName, methods, NELEM(methods));
1326}
1327
1328// ---------------------------------------------------------------------------
1329
1330jint 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        ALOGE("ERROR: GetEnv failed\n");
1337        goto bail;
1338    }
1339    assert(env != NULL);
1340
1341    if (registerFuncs(env) < 0) {
1342        ALOGE("ERROR: MediaPlayer native registration failed\n");
1343        goto bail;
1344    }
1345
1346    /* success -- return valid version number */
1347    result = JNI_VERSION_1_4;
1348
1349bail:
1350    return result;
1351}
1352