diff options
| author | 2017-06-19 22:07:45 +0000 | |
|---|---|---|
| committer | 2017-06-19 22:07:45 +0000 | |
| commit | e7191f50b5536c58a44d9f858081add8fb33dc9e (patch) | |
| tree | 8644f5d85c76118d3041efd696c4da43b54cebc6 | |
| parent | d974296f8cc596ac8c37c81448e04023ad821a90 (diff) | |
| parent | b6dde12ef0cd9bfae5f0910785411a04c88e1dd3 (diff) | |
Merge "Add an extra level of indirection to make sure that native IHwBinder"
am: b6dde12ef0
Change-Id: I342d0d1a09ed1677b7619df7df033471b48c937a
| -rw-r--r-- | core/jni/android_os_HwBinder.cpp | 58 | ||||
| -rw-r--r-- | core/jni/android_os_HwBinder.h | 9 | ||||
| -rw-r--r-- | core/jni/android_os_HwParcel.cpp | 6 | ||||
| -rw-r--r-- | core/jni/android_os_HwParcel.h | 1 | ||||
| -rw-r--r-- | core/jni/android_os_HwRemoteBinder.cpp | 4 | ||||
| -rw-r--r-- | core/jni/android_os_HwRemoteBinder.h | 1 |
6 files changed, 46 insertions, 33 deletions
diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp index b5c881537c41..a271aad0eb47 100644 --- a/core/jni/android_os_HwBinder.cpp +++ b/core/jni/android_os_HwBinder.cpp @@ -58,6 +58,29 @@ static struct fields_t { jmethodID onTransactID; } gFields; +struct JHwBinderHolder : public RefBase { + JHwBinderHolder() {} + + sp<JHwBinder> get(JNIEnv *env, jobject obj) { + Mutex::Autolock autoLock(mLock); + + sp<JHwBinder> binder = mBinder.promote(); + + if (binder == NULL) { + binder = new JHwBinder(env, obj); + mBinder = binder; + } + + return binder; + } + +private: + Mutex mLock; + wp<JHwBinder> mBinder; + + DISALLOW_COPY_AND_ASSIGN(JHwBinderHolder); +}; + // static void JHwBinder::InitClass(JNIEnv *env) { ScopedLocalRef<jclass> clazz( @@ -75,10 +98,10 @@ void JHwBinder::InitClass(JNIEnv *env) { } // static -sp<JHwBinder> JHwBinder::SetNativeContext( - JNIEnv *env, jobject thiz, const sp<JHwBinder> &context) { - sp<JHwBinder> old = - (JHwBinder *)env->GetLongField(thiz, gFields.contextID); +sp<JHwBinderHolder> JHwBinder::SetNativeContext( + JNIEnv *env, jobject thiz, const sp<JHwBinderHolder> &context) { + sp<JHwBinderHolder> old = + (JHwBinderHolder *)env->GetLongField(thiz, gFields.contextID); if (context != NULL) { context->incStrong(NULL /* id */); @@ -94,27 +117,27 @@ sp<JHwBinder> JHwBinder::SetNativeContext( } // static -sp<JHwBinder> JHwBinder::GetNativeContext( +sp<JHwBinder> JHwBinder::GetNativeBinder( JNIEnv *env, jobject thiz) { - return (JHwBinder *)env->GetLongField(thiz, gFields.contextID); + JHwBinderHolder *holder = + reinterpret_cast<JHwBinderHolder *>( + env->GetLongField(thiz, gFields.contextID)); + + return holder->get(env, thiz); } JHwBinder::JHwBinder(JNIEnv *env, jobject thiz) { jclass clazz = env->GetObjectClass(thiz); CHECK(clazz != NULL); - mClass = (jclass)env->NewGlobalRef(clazz); - mObject = env->NewWeakGlobalRef(thiz); + mObject = env->NewGlobalRef(thiz); } JHwBinder::~JHwBinder() { JNIEnv *env = AndroidRuntime::getJNIEnv(); - env->DeleteWeakGlobalRef(mObject); + env->DeleteGlobalRef(mObject); mObject = NULL; - - env->DeleteGlobalRef(mClass); - mClass = NULL; } status_t JHwBinder::onTransact( @@ -201,10 +224,10 @@ status_t JHwBinder::onTransact( using namespace android; static void releaseNativeContext(void *nativeContext) { - sp<JHwBinder> binder = (JHwBinder *)nativeContext; + sp<JHwBinderHolder> context = static_cast<JHwBinderHolder *>(nativeContext); - if (binder != NULL) { - binder->decStrong(NULL /* id */); + if (context != NULL) { + context->decStrong(NULL /* id */); } } @@ -215,8 +238,7 @@ static jlong JHwBinder_native_init(JNIEnv *env) { } static void JHwBinder_native_setup(JNIEnv *env, jobject thiz) { - sp<JHwBinder> context = new JHwBinder(env, thiz); - + sp<JHwBinderHolder> context = new JHwBinderHolder; JHwBinder::SetNativeContext(env, thiz, context); } @@ -244,7 +266,7 @@ static void JHwBinder_native_registerService( return; // XXX exception already pending? } - sp<hardware::IBinder> binder = JHwBinder::GetNativeContext(env, thiz); + sp<hardware::IBinder> binder = JHwBinder::GetNativeBinder(env, thiz); /* TODO(b/33440494) this is not right */ sp<hidl::base::V1_0::IBase> base = new hidl::base::V1_0::BpHwBase(binder); diff --git a/core/jni/android_os_HwBinder.h b/core/jni/android_os_HwBinder.h index fa8fe01d6e93..5352f1e607c2 100644 --- a/core/jni/android_os_HwBinder.h +++ b/core/jni/android_os_HwBinder.h @@ -24,13 +24,15 @@ namespace android { +struct JHwBinderHolder; + struct JHwBinder : public hardware::BHwBinder { static void InitClass(JNIEnv *env); - static sp<JHwBinder> SetNativeContext( - JNIEnv *env, jobject thiz, const sp<JHwBinder> &context); + static sp<JHwBinderHolder> SetNativeContext( + JNIEnv *env, jobject thiz, const sp<JHwBinderHolder> &context); - static sp<JHwBinder> GetNativeContext(JNIEnv *env, jobject thiz); + static sp<JHwBinder> GetNativeBinder(JNIEnv *env, jobject thiz); JHwBinder(JNIEnv *env, jobject thiz); @@ -45,7 +47,6 @@ protected: TransactCallback callback); private: - jclass mClass; jobject mObject; DISALLOW_COPY_AND_ASSIGN(JHwBinder); diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp index b21ea828f2a4..6ea809aa95ad 100644 --- a/core/jni/android_os_HwParcel.cpp +++ b/core/jni/android_os_HwParcel.cpp @@ -169,7 +169,6 @@ JHwParcel::JHwParcel(JNIEnv *env, jobject thiz) jclass clazz = env->GetObjectClass(thiz); CHECK(clazz != NULL); - mClass = (jclass)env->NewGlobalRef(clazz); mObject = env->NewWeakGlobalRef(thiz); } @@ -182,9 +181,6 @@ JHwParcel::~JHwParcel() { env->DeleteWeakGlobalRef(mObject); mObject = NULL; - - env->DeleteGlobalRef(mClass); - mClass = NULL; } hardware::Parcel *JHwParcel::getParcel() { @@ -542,7 +538,7 @@ static void JHwParcel_native_writeStrongBinder( env, FindClassOrDie(env, PACKAGE_PATH "/HwRemoteBinder")); if (env->IsInstanceOf(binderObj, hwBinderKlass.get())) { - binder = JHwBinder::GetNativeContext(env, binderObj); + binder = JHwBinder::GetNativeBinder(env, binderObj); } else if (env->IsInstanceOf(binderObj, hwRemoteBinderKlass.get())) { binder = JHwRemoteBinder::GetNativeContext( env, binderObj)->getBinder(); diff --git a/core/jni/android_os_HwParcel.h b/core/jni/android_os_HwParcel.h index f81de9bf30b7..f6e61004b0e3 100644 --- a/core/jni/android_os_HwParcel.h +++ b/core/jni/android_os_HwParcel.h @@ -53,7 +53,6 @@ protected: virtual ~JHwParcel(); private: - jclass mClass; jobject mObject; hardware::Parcel *mParcel; diff --git a/core/jni/android_os_HwRemoteBinder.cpp b/core/jni/android_os_HwRemoteBinder.cpp index f2f8e52db9f5..9c2ee9cfec45 100644 --- a/core/jni/android_os_HwRemoteBinder.cpp +++ b/core/jni/android_os_HwRemoteBinder.cpp @@ -272,7 +272,6 @@ JHwRemoteBinder::JHwRemoteBinder( jclass clazz = env->GetObjectClass(thiz); CHECK(clazz != NULL); - mClass = (jclass)env->NewGlobalRef(clazz); mObject = env->NewWeakGlobalRef(thiz); } @@ -281,9 +280,6 @@ JHwRemoteBinder::~JHwRemoteBinder() { env->DeleteWeakGlobalRef(mObject); mObject = NULL; - - env->DeleteGlobalRef(mClass); - mClass = NULL; } sp<hardware::IBinder> JHwRemoteBinder::getBinder() const { diff --git a/core/jni/android_os_HwRemoteBinder.h b/core/jni/android_os_HwRemoteBinder.h index 77a02784926d..63aad0ab2923 100644 --- a/core/jni/android_os_HwRemoteBinder.h +++ b/core/jni/android_os_HwRemoteBinder.h @@ -68,7 +68,6 @@ protected: virtual ~JHwRemoteBinder(); private: - jclass mClass; jobject mObject; sp<hardware::IBinder> mBinder; |