GraphicsJNI.h revision 47cd8e921db73e894f94ec4729ade90da50996f5
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef GraphicsJNI_DEFINED 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define GraphicsJNI_DEFINED 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkBitmap.h" 569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include "SkDevice.h" 669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include "SkPixelRef.h" 769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include "SkMallocPixelRef.h" 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkPoint.h" 969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include "SkRect.h" 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkImageDecoder.h" 1169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include <jni.h> 1269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 1369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughesclass SkBitmapRegionDecoder; 1469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughesclass SkCanvas; 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkPaint; 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass TypefaceImpl; 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianclass GraphicsJNI { 220795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianpublic: 230795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian enum BitmapCreateFlags { 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kBitmapCreateFlag_None = 0x0, 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kBitmapCreateFlag_Mutable = 0x1, 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kBitmapCreateFlag_Premultiplied = 0x2, 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // returns true if an exception is set (and dumps it out to the Log) 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static bool hasException(JNIEnv*); 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void get_jrect(JNIEnv*, jobject jrect, int* L, int* T, int* R, int* B); 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void set_jrect(JNIEnv*, jobject jrect, int L, int T, int R, int B); 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35242d65bf9faf1d2bc3468490e510551140e23462San Mehat static SkIRect* jrect_to_irect(JNIEnv*, jobject jrect, SkIRect*); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void irect_to_jrect(const SkIRect&, JNIEnv*, jobject jrect); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRect* jrectf_to_rect(JNIEnv*, jobject jrectf, SkRect*); 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRect* jrect_to_rect(JNIEnv*, jobject jrect, SkRect*); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void rect_to_jrectf(const SkRect&, JNIEnv*, jobject jrectf); 416af763bec7c3f4d50fee8dd0046409bb8a7fe8f6Glenn Kasten 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void set_jpoint(JNIEnv*, jobject jrect, int x, int y); 43957e58670baad8c5995f1368e3b5280f0dbd891fSan Mehat 44160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate static SkIPoint* jpoint_to_ipoint(JNIEnv*, jobject jpoint, SkIPoint* point); 45a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat static void ipoint_to_jpoint(const SkIPoint& point, JNIEnv*, jobject jpoint); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkPoint* jpointf_to_point(JNIEnv*, jobject jpointf, SkPoint* point); 48160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate static void point_to_jpointf(const SkPoint& point, JNIEnv*, jobject jpointf); 49160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate 50160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate static SkCanvas* getNativeCanvas(jlong nativeHandle); 51160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate static SkCanvas* getNativeCanvas(JNIEnv*, jobject canvas); 52160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate static SkPaint* getNativePaint(JNIEnv*, jobject paint); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static android::TypefaceImpl* getNativeTypeface(JNIEnv*, jobject paint); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkBitmap* getNativeBitmap(JNIEnv*, jobject bitmap); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRegion* getNativeRegion(JNIEnv*, jobject region); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Given the 'native' long held by the Rasterizer.java object, return a 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ref to its SkRasterizer* (or NULL). 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRasterizer* refNativeRasterizer(jlong rasterizerHandle); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * LegacyBitmapConfig is the old enum in Skia that matched the enum int values 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in Bitmap.Config. Skia no longer supports this config, but has replaced it 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with SkColorType. These routines convert between the two. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkColorType legacyBitmapConfigToColorType(jint legacyConfig); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint colorTypeToLegacyBitmapConfig(SkColorType colorType); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Return the corresponding native colorType from the java Config enum, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project or kUnknown_SkColorType if the java object is null. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkColorType getNativeBitmapColorType(JNIEnv*, jobject jconfig); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat /** Create a java Bitmap object given the native bitmap (required) and optional 75e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat storage array (may be null). 76e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat bitmap's SkAlphaType must already be in sync with bitmapCreateFlags. 77e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat */ 78e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat static jobject createBitmap(JNIEnv* env, SkBitmap* bitmap, jbyteArray buffer, 79e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat int bitmapCreateFlags, jbyteArray ninePatch, jobject ninePatchInsets, int density = -1); 80e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat 81e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat static jobject createBitmap(JNIEnv* env, SkBitmap* bitmap, int bitmapCreateFlags, 82e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat jbyteArray ninePatch, int density = -1) { 83e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat return createBitmap(env, bitmap, NULL, bitmapCreateFlags, ninePatch, NULL, density); 84e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat } 85e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat 86e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat /** Reinitialize a bitmap. bitmap must already have its SkAlphaType set in 87e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat sync with isPremultiplied 88e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat */ 89e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat static void reinitBitmap(JNIEnv* env, jobject javaBitmap, SkBitmap* bitmap, 90e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat bool isPremultiplied); 91e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat 92e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat static int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap); 93e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat 94e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat static jobject createRegion(JNIEnv* env, SkRegion* region); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jobject createBitmapRegionDecoder(JNIEnv* env, SkBitmapRegionDecoder* bitmap); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jbyteArray allocateJavaPixelRef(JNIEnv* env, SkBitmap* bitmap, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkColorTable* ctable); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Copy the colors in colors[] to the bitmap, convert to the correct 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project format along the way. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Whether to use premultiplied pixels is determined by dstBitmap's alphaType. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static bool SetPixels(JNIEnv* env, jintArray colors, int srcOffset, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int srcStride, int x, int y, int width, int height, 107887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn const SkBitmap& dstBitmap); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jbyteArray getBitmapStorageObj(SkPixelRef *pixref); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AndroidPixelRef : public SkMallocPixelRef { 11369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughespublic: 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AndroidPixelRef(JNIEnv* env, const SkImageInfo& info, void* storage, size_t rowBytes, 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray storageObj, SkColorTable* ctable); 11669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates an AndroidPixelRef that wraps (and refs) another to reuse/share 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same storage and java byte array refcounting, yet have a different 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * color table. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AndroidPixelRef(AndroidPixelRef& wrappedPixelRef, const SkImageInfo& info, 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t rowBytes, SkColorTable* ctable); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AndroidPixelRef(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray getStorageObj(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setLocalJNIRef(jbyteArray arr); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Used to hold a ref to the pixels when the Java bitmap may be collected. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If specified, 'localref' is a valid JNI local reference to the byte array 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containing the pixel data. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 'localref' may only be NULL if setLocalJNIRef() was already called with 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a JNI local ref that is still valid. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void globalRef(void* localref=NULL); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Release a ref that was acquired using globalRef(). */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void globalUnref(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 14469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes AndroidPixelRef* const fWrappedPixelRef; // if set, delegate memory management calls to this 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* fVM; 14769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes bool fOnJavaHeap; // If true, the memory was allocated on the Java heap 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray fStorageObj; // The Java byte[] object used as the bitmap backing store 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool fHasGlobalRef; // If true, fStorageObj holds a JNI global ref 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable int32_t fGlobalRefCnt; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** A helper class for accessing Java-heap-allocated bitmaps. 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This should be used when calling into a JNI method that retains a 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference to the bitmap longer than the lifetime of the Java Bitmap. 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * After creating an instance of this class, a call to 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AndroidPixelRef::globalRef() will allocate a JNI global reference 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the backing buffer object. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaHeapBitmapRef { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaHeapBitmapRef(JNIEnv *env, SkBitmap* nativeBitmap, jbyteArray buffer); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~JavaHeapBitmapRef(); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkBitmap* fNativeBitmap; 172e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat jbyteArray fBuffer; 173e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat}; 174887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 175887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn/** Allocator which allocates the backing buffer in the Java heap. 176887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn * Instances can only be used to perform a single allocation, which helps 177e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat * ensure that the allocated buffer is properly accounted for with a 178e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat * reference in the heap (or a JNI global reference). 179e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat */ 180e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehatclass JavaPixelAllocator : public SkBitmap::Allocator { 18169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughespublic: 1823e458241d9930465a20a861ecb42744355d48e48San Mehat JavaPixelAllocator(JNIEnv* env); 1833e458241d9930465a20a861ecb42744355d48e48San Mehat // overrides 1843e458241d9930465a20a861ecb42744355d48e48San Mehat virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable); 1853e458241d9930465a20a861ecb42744355d48e48San Mehat 1863e458241d9930465a20a861ecb42744355d48e48San Mehat /** Return the Java array object created for the last allocation. 1873e458241d9930465a20a861ecb42744355d48e48San Mehat * This returns a local JNI reference which the caller is responsible 18869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes * for storing appropriately (usually by passing it to the Bitmap 1893e458241d9930465a20a861ecb42744355d48e48San Mehat * constructor). 1903e458241d9930465a20a861ecb42744355d48e48San Mehat */ 1913e458241d9930465a20a861ecb42744355d48e48San Mehat jbyteArray getStorageObj() { return fStorageObj; } 1923e458241d9930465a20a861ecb42744355d48e48San Mehat 193a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat /** Same as getStorageObj(), but also resets the allocator so that it 194a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat * can allocate again. 195a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat */ 196a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat jbyteArray getStorageObjAndReset() { 197a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat jbyteArray result = fStorageObj; 198a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat fStorageObj = NULL; 199a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat fAllocCount = 0; 200a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat return result; 201a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat }; 202a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat 203a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehatprivate: 204a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat JavaVM* fVM; 205a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat bool fAllocateInJavaHeap; 20669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jbyteArray fStorageObj; 207a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat int fAllocCount; 2085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block}; 209a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat 2105baa3a62a97544669fba6d65a11c07f252e654ddSteve Blockenum JNIAccess { 211a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat kRO_JNIAccess, 212a5109a878eeff22e32ee5ce1b1cd15e8daad5234San Mehat kRW_JNIAccess 2133e458241d9930465a20a861ecb42744355d48e48San Mehat}; 2143e458241d9930465a20a861ecb42744355d48e48San Mehat 2151fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehatclass AutoJavaFloatArray { 2161fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehatpublic: 2171fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehat AutoJavaFloatArray(JNIEnv* env, jfloatArray array, 2183e458241d9930465a20a861ecb42744355d48e48San Mehat int minLength = 0, JNIAccess = kRW_JNIAccess); 2193e458241d9930465a20a861ecb42744355d48e48San Mehat ~AutoJavaFloatArray(); 2203e458241d9930465a20a861ecb42744355d48e48San Mehat 2213e458241d9930465a20a861ecb42744355d48e48San Mehat float* ptr() const { return fPtr; } 2227e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat int length() const { return fLen; } 2237e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat 2247e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehatprivate: 2253e458241d9930465a20a861ecb42744355d48e48San Mehat JNIEnv* fEnv; 2263e458241d9930465a20a861ecb42744355d48e48San Mehat jfloatArray fArray; 2277e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat float* fPtr; 2287e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat int fLen; 2297e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat int fReleaseMode; 2303762c311729fe9f3af085c14c5c1fb471d994c03Steve Block}; 2317e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat 2327e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehatclass AutoJavaIntArray { 2331fd0ec738b0a2b97cc28701aa37b1a9869afc684San Mehatpublic: 2347e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat AutoJavaIntArray(JNIEnv* env, jintArray array, int minLength = 0); 2357e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat ~AutoJavaIntArray(); 2367e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat 2377e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat jint* ptr() const { return fPtr; } 2387e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat int length() const { return fLen; } 2397e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehat 2407e63789a0e0689d940609b1daceebc1bc08dcbefSan Mehatprivate: 24169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes JNIEnv* fEnv; 24284bb52ed614f3a13370c923a8bc2a8b7c6db8d30Dianne Hackborn jintArray fArray; 243242d65bf9faf1d2bc3468490e510551140e23462San Mehat jint* fPtr; 2440a42b811aea490a9a605b75f0320101f6eafd283San Mehat int fLen; 245242d65bf9faf1d2bc3468490e510551140e23462San Mehat}; 2463e458241d9930465a20a861ecb42744355d48e48San Mehat 2473e458241d9930465a20a861ecb42744355d48e48San Mehatclass AutoJavaShortArray { 2483e458241d9930465a20a861ecb42744355d48e48San Mehatpublic: 2493e458241d9930465a20a861ecb42744355d48e48San Mehat AutoJavaShortArray(JNIEnv* env, jshortArray array, 250160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate int minLength = 0, JNIAccess = kRW_JNIAccess); 251160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate ~AutoJavaShortArray(); 252160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate 253160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate jshort* ptr() const { return fPtr; } 25471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block int length() const { return fLen; } 255160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate 256160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tateprivate: 257160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate JNIEnv* fEnv; 258160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate jshortArray fArray; 259160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate jshort* fPtr; 260160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate int fLen; 261160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate int fReleaseMode; 262160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate}; 263160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate 264160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tateclass AutoJavaByteArray { 265160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tatepublic: 266160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate AutoJavaByteArray(JNIEnv* env, jbyteArray array, int minLength = 0); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaByteArray(); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* ptr() const { return fPtr; } 270160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate int length() const { return fLen; } 271160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate 272160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tateprivate: 273160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate JNIEnv* fEnv; 274160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate jbyteArray fArray; 275160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate jbyte* fPtr; 276160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate int fLen; 2773762c311729fe9f3af085c14c5c1fb471d994c03Steve Block}; 278160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate 279160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tatevoid doThrowNPE(JNIEnv* env); 280160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tatevoid doThrowAIOOBE(JNIEnv* env); // Array Index Out Of Bounds Exception 281160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tatevoid doThrowIAE(JNIEnv* env, const char* msg = NULL); // Illegal Argument 282160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tatevoid doThrowRE(JNIEnv* env, const char* msg = NULL); // Runtime 283160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tatevoid doThrowISE(JNIEnv* env, const char* msg = NULL); // Illegal State 284160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tatevoid doThrowOOME(JNIEnv* env, const char* msg = NULL); // Out of memory 285887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackbornvoid doThrowIOE(JNIEnv* env, const char* msg = NULL); // IO Exception 286887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 287887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn#define NPE_CHECK_RETURN_ZERO(env, object) \ 288887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn do { if (NULL == (object)) { doThrowNPE(env); return 0; } } while (0) 289887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 290887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn#define NPE_CHECK_RETURN_VOID(env, object) \ 291887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn do { if (NULL == (object)) { doThrowNPE(env); return; } } while (0) 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#endif 2946215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block