diff options
| author | Mathieu Chartier <mathieuc@google.com> | 2015-09-12 04:20:33 +0000 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2015-09-12 04:20:33 +0000 |
| commit | 6481871f9d4449b5f9fe29e771127ae544dc86f7 (patch) | |
| tree | 57310e6be5f813666a226ca8bf7153e3cee3f7f3 | |
| parent | f8d8650095bc70b31fd5662f0dc41e19dab086d7 (diff) | |
| parent | 50be0353ae7536e620c5666c1b490e78e51592bd (diff) | |
| download | platform_libnativehelper-brillo-m7-dev.tar.gz platform_libnativehelper-brillo-m7-dev.tar.bz2 platform_libnativehelper-brillo-m7-dev.zip | |
am 50be0353: Merge "Speed up ScopedPrimitiveArrayRO"brillo-m7-releasebrillo-m7-mr-devbrillo-m7-dev
* commit '50be0353ae7536e620c5666c1b490e78e51592bd':
Speed up ScopedPrimitiveArrayRO
| -rw-r--r-- | include/nativehelper/ScopedPrimitiveArray.h | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/include/nativehelper/ScopedPrimitiveArray.h b/include/nativehelper/ScopedPrimitiveArray.h index b573bd6..b681b99 100644 --- a/include/nativehelper/ScopedPrimitiveArray.h +++ b/include/nativehelper/ScopedPrimitiveArray.h @@ -27,32 +27,44 @@ class Scoped ## NAME ## ArrayRO { \ public: \ explicit Scoped ## NAME ## ArrayRO(JNIEnv* env) \ - : mEnv(env), mJavaArray(NULL), mRawArray(NULL) {} \ + : mEnv(env), mJavaArray(NULL), mRawArray(NULL), mSize(0) {} \ Scoped ## NAME ## ArrayRO(JNIEnv* env, PRIMITIVE_TYPE ## Array javaArray) \ - : mEnv(env), mJavaArray(javaArray), mRawArray(NULL) { \ - if (mJavaArray == NULL) { \ + : mEnv(env) { \ + if (javaArray == NULL) { \ + mJavaArray = NULL; \ + mSize = 0; \ + mRawArray = NULL; \ jniThrowNullPointerException(mEnv, NULL); \ } else { \ - mRawArray = mEnv->Get ## NAME ## ArrayElements(mJavaArray, NULL); \ + reset(javaArray); \ } \ } \ ~Scoped ## NAME ## ArrayRO() { \ - if (mRawArray) { \ + if (mRawArray != NULL && mRawArray != mBuffer) { \ mEnv->Release ## NAME ## ArrayElements(mJavaArray, mRawArray, JNI_ABORT); \ } \ } \ void reset(PRIMITIVE_TYPE ## Array javaArray) { \ mJavaArray = javaArray; \ - mRawArray = mEnv->Get ## NAME ## ArrayElements(mJavaArray, NULL); \ + mSize = mEnv->GetArrayLength(mJavaArray); \ + if (mSize <= buffer_size) { \ + mEnv->Get ## NAME ## ArrayRegion(mJavaArray, 0, mSize, mBuffer); \ + mRawArray = mBuffer; \ + } else { \ + mRawArray = mEnv->Get ## NAME ## ArrayElements(mJavaArray, NULL); \ + } \ } \ const PRIMITIVE_TYPE* get() const { return mRawArray; } \ PRIMITIVE_TYPE ## Array getJavaArray() const { return mJavaArray; } \ const PRIMITIVE_TYPE& operator[](size_t n) const { return mRawArray[n]; } \ - size_t size() const { return mEnv->GetArrayLength(mJavaArray); } \ + size_t size() const { return mSize; } \ private: \ + static const jsize buffer_size = 1024; \ JNIEnv* const mEnv; \ PRIMITIVE_TYPE ## Array mJavaArray; \ PRIMITIVE_TYPE* mRawArray; \ + jsize mSize; \ + PRIMITIVE_TYPE mBuffer[buffer_size]; \ DISALLOW_COPY_AND_ASSIGN(Scoped ## NAME ## ArrayRO); \ } |
