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