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