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