From dc74ee2ddca869b0353e35fc3d3d384a9defc2ed Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Wed, 5 Aug 2020 15:38:31 -0700 Subject: [PATCH] Refactor CallbackUtils. --- android/common/CallbackUtils.cpp | 59 ++++++++----------- android/common/CallbackUtils.h | 3 +- .../filament-android/src/main/cpp/Texture.cpp | 19 +----- 3 files changed, 28 insertions(+), 53 deletions(-) diff --git a/android/common/CallbackUtils.cpp b/android/common/CallbackUtils.cpp index c5a8affcfa..dd962cda64 100644 --- a/android/common/CallbackUtils.cpp +++ b/android/common/CallbackUtils.cpp @@ -16,7 +16,7 @@ #include "CallbackUtils.h" -void initCallbackJni(JNIEnv* env, CallbackJni& callbackUtils) { +void acquireCallbackJni(JNIEnv* env, CallbackJni& callbackUtils) { #ifdef ANDROID callbackUtils.handlerClass = env->FindClass("android/os/Handler"); callbackUtils.handlerClass = (jclass) env->NewGlobalRef(callbackUtils.handlerClass); @@ -30,6 +30,25 @@ void initCallbackJni(JNIEnv* env, CallbackJni& callbackUtils) { "execute", "(Ljava/lang/Runnable;)V"); } +void releaseCallbackJni(JNIEnv* env, CallbackJni callbackUtils, jobject handler, jobject callback) { + if (handler && callback) { +#ifdef ANDROID + if (env->IsInstanceOf(handler, callbackUtils.handlerClass)) { + env->CallBooleanMethod(handler, callbackUtils.post, callback); + } +#endif + if (env->IsInstanceOf(handler, callbackUtils.executorClass)) { + env->CallVoidMethod(handler, callbackUtils.execute, callback); + } + } + env->DeleteGlobalRef(handler); + env->DeleteGlobalRef(callback); +#ifdef ANDROID + env->DeleteGlobalRef(callbackUtils.handlerClass); +#endif + env->DeleteGlobalRef(callbackUtils.executorClass); +} + JniBufferCallback* JniBufferCallback::make(filament::Engine* engine, JNIEnv* env, jobject handler, jobject callback, AutoBuffer&& buffer) { return new JniBufferCallback(env, handler, callback, std::move(buffer)); @@ -41,26 +60,11 @@ JniBufferCallback::JniBufferCallback(JNIEnv* env, jobject handler, jobject callb , mHandler(env->NewGlobalRef(handler)) , mCallback(env->NewGlobalRef(callback)) , mBuffer(std::move(buffer)) { - initCallbackJni(env, mCallbackUtils); + acquireCallbackJni(env, mCallbackUtils); } JniBufferCallback::~JniBufferCallback() { - if (mHandler && mCallback) { -#ifdef ANDROID - if (mEnv->IsInstanceOf(mHandler, mCallbackUtils.handlerClass)) { - mEnv->CallBooleanMethod(mHandler, mCallbackUtils.post, mCallback); - } -#endif - if (mEnv->IsInstanceOf(mHandler, mCallbackUtils.executorClass)) { - mEnv->CallVoidMethod(mHandler, mCallbackUtils.execute, mCallback); - } - } - mEnv->DeleteGlobalRef(mHandler); - mEnv->DeleteGlobalRef(mCallback); -#ifdef ANDROID - mEnv->DeleteGlobalRef(mCallbackUtils.handlerClass); -#endif - mEnv->DeleteGlobalRef(mCallbackUtils.executorClass); + releaseCallbackJni(mEnv, mCallbackUtils, mHandler, mCallback); } void JniBufferCallback::invoke(void*, size_t, void* user) { @@ -80,26 +84,11 @@ JniImageCallback::JniImageCallback(JNIEnv* env, jobject handler, jobject callbac , mHandler(env->NewGlobalRef(handler)) , mCallback(env->NewGlobalRef(callback)) , mImage(image) { - initCallbackJni(env, mCallbackUtils); + acquireCallbackJni(env, mCallbackUtils); } JniImageCallback::~JniImageCallback() { - if (mHandler && mCallback) { -#ifdef ANDROID - if (mEnv->IsInstanceOf(mHandler, mCallbackUtils.handlerClass)) { - mEnv->CallBooleanMethod(mHandler, mCallbackUtils.post, mCallback); - } -#endif - if (mEnv->IsInstanceOf(mHandler, mCallbackUtils.executorClass)) { - mEnv->CallVoidMethod(mHandler, mCallbackUtils.execute, mCallback); - } - } - mEnv->DeleteGlobalRef(mHandler); - mEnv->DeleteGlobalRef(mCallback); -#ifdef ANDROID - mEnv->DeleteGlobalRef(mCallbackUtils.handlerClass); -#endif - mEnv->DeleteGlobalRef(mCallbackUtils.executorClass); + releaseCallbackJni(mEnv, mCallbackUtils, mHandler, mCallback); } void JniImageCallback::invoke(void*, void* user) { diff --git a/android/common/CallbackUtils.h b/android/common/CallbackUtils.h index d8290fbd7c..c94213f4d8 100644 --- a/android/common/CallbackUtils.h +++ b/android/common/CallbackUtils.h @@ -32,7 +32,8 @@ struct CallbackJni { jmethodID execute; }; -void initCallbackJni(JNIEnv* env, CallbackJni& callbackUtils); +void acquireCallbackJni(JNIEnv* env, CallbackJni& callbackUtils); +void releaseCallbackJni(JNIEnv* env, CallbackJni callbackUtils, jobject handler, jobject callback); struct JniBufferCallback { static JniBufferCallback* make(filament::Engine* engine, diff --git a/android/filament-android/src/main/cpp/Texture.cpp b/android/filament-android/src/main/cpp/Texture.cpp index 876dcd7044..d2a1cdd20b 100644 --- a/android/filament-android/src/main/cpp/Texture.cpp +++ b/android/filament-android/src/main/cpp/Texture.cpp @@ -410,7 +410,7 @@ public: , mHandler(env->NewGlobalRef(handler)) , mCallback(env->NewGlobalRef(runnable)) { - initCallbackJni(env, mCallbackUtils); + acquireCallbackJni(env, mCallbackUtils); if (mBitmap) { AndroidBitmap_getInfo(mEnv, mBitmap, &mInfo); AndroidBitmap_lockPixels(mEnv, mBitmap, &mData); @@ -418,22 +418,7 @@ public: } ~AutoBitmap() noexcept { - if (mHandler && mCallback) { - #ifdef ANDROID - if (mEnv->IsInstanceOf(mHandler, mCallbackUtils.handlerClass)) { - mEnv->CallBooleanMethod(mHandler, mCallbackUtils.post, mCallback); - } - #endif - if (mEnv->IsInstanceOf(mHandler, mCallbackUtils.executorClass)) { - mEnv->CallVoidMethod(mHandler, mCallbackUtils.execute, mCallback); - } - } - mEnv->DeleteGlobalRef(mHandler); - mEnv->DeleteGlobalRef(mCallback); - #ifdef ANDROID - mEnv->DeleteGlobalRef(mCallbackUtils.handlerClass); - #endif - mEnv->DeleteGlobalRef(mCallbackUtils.executorClass); + releaseCallbackJni(mEnv, mCallbackUtils, mHandler, mCallback); if (mBitmap) { AndroidBitmap_unlockPixels(mEnv, mBitmap); mEnv->DeleteGlobalRef(mBitmap);