源码位置:frameworks/base/core/jni/android_util_Binder.cpp

方法

  • android_os_BinderInternal_getContextObject
    1033 static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
    1034 {
    1035     sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
    1036     return javaObjectForIBinder(env, b);
    1037 }

ProcessState类见:http://xinyiworld.top/wordpress_it/?p=14446

  • javaObjectForIBinder
662 // If the argument is a JavaBBinder, return the Java object that was used to create it.
 663 // Otherwise return a BinderProxy for the IBinder. If a previous call was passed the
 664 // same IBinder, and the original BinderProxy is still alive, return the same BinderProxy.
 665 jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val)
 666 {   
 667     if (val == NULL) return NULL;
 668     
 669     if (val->checkSubclass(&gBinderOffsets)) {
 670         // It's a JavaBBinder created by ibinderForJavaObject. Already has Java object.
 671         jobject object = static_cast<JavaBBinder*>(val.get())->object();
 672         LOGDEATH("objectForBinder %p: it's our own %p!\n", val.get(), object);
 673         return object;
 674     }
 675     
 676     BinderProxyNativeData* nativeData = new BinderProxyNativeData();
 677     nativeData->mOrgue = new DeathRecipientList;
 678     nativeData->mObject = val;
 679 
 680     jobject object = env->CallStaticObjectMethod(gBinderProxyOffsets.mClass,
 681             gBinderProxyOffsets.mGetInstance, (jlong) nativeData, (jlong) val.get());
 682     if (env->ExceptionCheck()) {
 683         // In the exception case, getInstance still took ownership of nativeData.
 684         return NULL;
 685     }
 686     BinderProxyNativeData* actualNativeData = getBPNativeData(env, object);
 687     if (actualNativeData == nativeData) {
 688         // Created a new Proxy
 689         uint32_t numProxies = gNumProxies.fetch_add(1, std::memory_order_relaxed);
 690         uint32_t numLastWarned = gProxiesWarned.load(std::memory_order_relaxed);
 691         if (numProxies >= numLastWarned + PROXY_WARN_INTERVAL) {
 692             // Multiple threads can get here, make sure only one of them gets to
 693             // update the warn counter.
 694             if (gProxiesWarned.compare_exchange_strong(numLastWarned,
 695                         numLastWarned + PROXY_WARN_INTERVAL, std::memory_order_relaxed)) {
 696                 ALOGW("Unexpectedly many live BinderProxies: %d\n", numProxies);
 697             }
 698         }
 699     } else {
 700         delete nativeData;
 701     }
 702 
 703     return object;
 704 }
分类: jni层

0 条评论

发表回复

您的电子邮箱地址不会被公开。