19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef GraphicsJNI_DEFINED 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define GraphicsJNI_DEFINED 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "SkBitmap.h" 5e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "SkDevice.h" 6e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "SkPixelRef.h" 7e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "SkMallocPixelRef.h" 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkPoint.h" 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkRect.h" 106b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen#include "../images/SkBitmapRegionDecoder.h" 11f1f48bc7f200f54c76b22d845d8ba8419879b375Joseph Wen#include "../images/SkImageDecoder.h" 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h> 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkCanvas; 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkPaint; 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkPicture; 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GraphicsJNI { 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // returns true if an exception is set (and dumps it out to the Log) 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static bool hasException(JNIEnv*); 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void get_jrect(JNIEnv*, jobject jrect, int* L, int* T, int* R, int* B); 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void set_jrect(JNIEnv*, jobject jrect, int L, int T, int R, int B); 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkIRect* jrect_to_irect(JNIEnv*, jobject jrect, SkIRect*); 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void irect_to_jrect(const SkIRect&, JNIEnv*, jobject jrect); 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRect* jrectf_to_rect(JNIEnv*, jobject jrectf, SkRect*); 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRect* jrect_to_rect(JNIEnv*, jobject jrect, SkRect*); 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void rect_to_jrectf(const SkRect&, JNIEnv*, jobject jrectf); 328451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void set_jpoint(JNIEnv*, jobject jrect, int x, int y); 348451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkIPoint* jpoint_to_ipoint(JNIEnv*, jobject jpoint, SkIPoint* point); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void ipoint_to_jpoint(const SkIPoint& point, JNIEnv*, jobject jpoint); 378451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkPoint* jpointf_to_point(JNIEnv*, jobject jpointf, SkPoint* point); 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void point_to_jpointf(const SkPoint& point, JNIEnv*, jobject jpointf); 408451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkCanvas* getNativeCanvas(JNIEnv*, jobject canvas); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkPaint* getNativePaint(JNIEnv*, jobject paint); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkBitmap* getNativeBitmap(JNIEnv*, jobject bitmap); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkPicture* getNativePicture(JNIEnv*, jobject picture); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRegion* getNativeRegion(JNIEnv*, jobject region); 468451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Return the corresponding native config from the java Config enum, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project or kNo_Config if the java object is null. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkBitmap::Config getNativeBitmapConfig(JNIEnv*, jobject jconfig); 518451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Create a java Bitmap object given the native bitmap (required) and optional 53e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy storage array (may be null). 54e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy */ 55e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy static jobject createBitmap(JNIEnv* env, SkBitmap* bitmap, jbyteArray buffer, 56ec4a50428d5f26a22df3edaf7e5b08f41d5cb54bAmith Yamasani bool isMutable, jbyteArray ninepatch, jintArray layoutbounds, 57ec4a50428d5f26a22df3edaf7e5b08f41d5cb54bAmith Yamasani int density = -1); 58e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jobject createBitmap(JNIEnv* env, SkBitmap* bitmap, bool isMutable, 60e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy jbyteArray ninepatch, int density = -1); 618451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jobject createRegion(JNIEnv* env, SkRegion* region); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 646b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen static jobject createBitmapRegionDecoder(JNIEnv* env, SkBitmapRegionDecoder* bitmap); 65f1f48bc7f200f54c76b22d845d8ba8419879b375Joseph Wen 66e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy static jbyteArray allocateJavaPixelRef(JNIEnv* env, SkBitmap* bitmap, 67e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy SkColorTable* ctable); 68e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Copy the colors in colors[] to the bitmap, convert to the correct 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project format along the way. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static bool SetPixels(JNIEnv* env, jintArray colors, int srcOffset, 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int srcStride, int x, int y, int width, int height, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SkBitmap& dstBitmap); 75e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 76e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy static jbyteArray getBitmapStorageObj(SkPixelRef *pixref); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroyclass AndroidPixelRef : public SkMallocPixelRef { 80e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroypublic: 81e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy AndroidPixelRef(JNIEnv* env, void* storage, size_t size, jbyteArray storageObj, 82e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy SkColorTable* ctable); 83e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 84e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy virtual ~AndroidPixelRef(); 85e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 86e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy jbyteArray getStorageObj() { return fStorageObj; } 87e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 88e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy void setLocalJNIRef(jbyteArray arr); 89e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 90a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy /** Used to hold a ref to the pixels when the Java bitmap may be collected. 91a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy * If specified, 'localref' is a valid JNI local reference to the byte array 92a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy * containing the pixel data. 93a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy * 94a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy * 'localref' may only be NULL if setLocalJNIRef() was already called with 95a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy * a JNI local ref that is still valid. 96a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy */ 97a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy virtual void globalRef(void* localref=NULL); 98a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy 99a2f0e2d6b7f9dff3a52dd78d6db307070a71e9b2Patrick Dubroy /** Release a ref that was acquired using globalRef(). */ 100e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy virtual void globalUnref(); 101e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 102e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroyprivate: 103e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy JavaVM* fVM; 104e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy bool fOnJavaHeap; // If true, the memory was allocated on the Java heap 105e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 106e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy jbyteArray fStorageObj; // The Java byte[] object used as the bitmap backing store 107e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy bool fHasGlobalRef; // If true, fStorageObj holds a JNI global ref 108e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 109e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy mutable int32_t fGlobalRefCnt; 110e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy}; 111e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 112e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy/** A helper class for accessing Java-heap-allocated bitmaps. 113e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * This should be used when calling into a JNI method that retains a 114e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * reference to the bitmap longer than the lifetime of the Java Bitmap. 115e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * 116e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * After creating an instance of this class, a call to 117e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * AndroidPixelRef::globalRef() will allocate a JNI global reference 118e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * to the backing buffer object. 119e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy */ 120e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroyclass JavaHeapBitmapRef { 121e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroypublic: 122e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 123e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy JavaHeapBitmapRef(JNIEnv *env, SkBitmap* nativeBitmap, jbyteArray buffer); 124e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy ~JavaHeapBitmapRef(); 125e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 126e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroyprivate: 127e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy JNIEnv* fEnv; 128e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy SkBitmap* fNativeBitmap; 129e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy jbyteArray fBuffer; 130e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy}; 131e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 132e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy/** Allocator which allocates the backing buffer in the Java heap. 133e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * Instances can only be used to perform a single allocation, which helps 134e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * ensure that the allocated buffer is properly accounted for with a 135e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy * reference in the heap (or a JNI global reference). 136e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaPixelAllocator : public SkBitmap::Allocator { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 13912d81c49a015ed8d5ef7af2d854eee1e80472219Carl Shapiro JavaPixelAllocator(JNIEnv* env); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overrides 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable); 1428451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 143afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy /** Return the Java array object created for the last allocation. 144afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy * This returns a local JNI reference which the caller is responsible 145afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy * for storing appropriately (usually by passing it to the Bitmap 146afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy * constructor). 147afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy */ 148afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy jbyteArray getStorageObj() { return fStorageObj; } 149afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy 150afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy /** Same as getStorageObj(), but also resets the allocator so that it 151afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy * can allocate again. 152afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy */ 153afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy jbyteArray getStorageObjAndReset() { 154afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy jbyteArray result = fStorageObj; 155afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy fStorageObj = NULL; 156afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy fAllocCount = 0; 157afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy return result; 158afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy }; 159e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 161291303ba3dbb3a0173bcc82ded595ca75df7b50eWei-Ta Chen JavaVM* fVM; 162e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy bool fAllocateInJavaHeap; 163e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy jbyteArray fStorageObj; 164afde46ed008f150e45e1b0d7e1dc588fc047b74fPatrick Dubroy int fAllocCount; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 167c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reedenum JNIAccess { 168c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed kRO_JNIAccess, 169c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed kRW_JNIAccess 170c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed}; 171c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaFloatArray { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 174c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed AutoJavaFloatArray(JNIEnv* env, jfloatArray array, 175c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed int minLength = 0, JNIAccess = kRW_JNIAccess); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaFloatArray(); 1778451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float* ptr() const { return fPtr; } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length() const { return fLen; } 1808451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloatArray fArray; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float* fPtr; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fLen; 186c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed int fReleaseMode; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaIntArray { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaIntArray(JNIEnv* env, jintArray array, int minLength = 0); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaIntArray(); 1938451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* ptr() const { return fPtr; } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length() const { return fLen; } 1968451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray fArray; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* fPtr; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fLen; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaShortArray { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 206c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed AutoJavaShortArray(JNIEnv* env, jshortArray array, 207c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed int minLength = 0, JNIAccess = kRW_JNIAccess); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaShortArray(); 2098451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jshort* ptr() const { return fPtr; } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length() const { return fLen; } 2128451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jshortArray fArray; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jshort* fPtr; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fLen; 218c04851fd0af87f44a7d7351e0c17442fa1d3fc28Mike Reed int fReleaseMode; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaByteArray { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaByteArray(JNIEnv* env, jbyteArray array, int minLength = 0); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaByteArray(); 2258451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* ptr() const { return fPtr; } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length() const { return fLen; } 2288451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray fArray; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* fPtr; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fLen; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowNPE(JNIEnv* env); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowAIOOBE(JNIEnv* env); // Array Index Out Of Bounds Exception 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowIAE(JNIEnv* env, const char* msg = NULL); // Illegal Argument 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowRE(JNIEnv* env, const char* msg = NULL); // Runtime 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowISE(JNIEnv* env, const char* msg = NULL); // Illegal State 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrowOOME(JNIEnv* env, const char* msg = NULL); // Out of memory 242f1f48bc7f200f54c76b22d845d8ba8419879b375Joseph Wenvoid doThrowIOE(JNIEnv* env, const char* msg = NULL); // IO Exception 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NPE_CHECK_RETURN_ZERO(env, object) \ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { if (NULL == (object)) { doThrowNPE(env); return 0; } } while (0) 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NPE_CHECK_RETURN_VOID(env, object) \ 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { if (NULL == (object)) { doThrowNPE(env); return; } } while (0) 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 251