Loading core/jni/android_util_Binder.cpp +34 −3 Original line number Original line Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <atomic> #include <atomic> #include <fcntl.h> #include <fcntl.h> #include <inttypes.h> #include <inttypes.h> #include <mutex> #include <stdio.h> #include <stdio.h> #include <sys/stat.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/types.h> Loading Loading @@ -69,6 +70,7 @@ static struct bindernative_offsets_t // Class state. // Class state. jclass mClass; jclass mClass; jmethodID mExecTransact; jmethodID mExecTransact; jmethodID mGetInterfaceDescriptor; // Object state. // Object state. jfieldID mObject; jfieldID mObject; Loading Loading @@ -326,8 +328,32 @@ protected: env->DeleteGlobalRef(mObject); env->DeleteGlobalRef(mObject); } } virtual status_t onTransact( const String16& getInterfaceDescriptor() const override uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) { call_once(mPopulateDescriptor, [this] { JNIEnv* env = javavm_to_jnienv(mVM); ALOGV("getInterfaceDescriptor() on %p calling object %p in env %p vm %p\n", this, mObject, env, mVM); jstring descriptor = (jstring)env->CallObjectMethod(mObject, gBinderOffsets.mGetInterfaceDescriptor); if (descriptor == nullptr) { return; } static_assert(sizeof(jchar) == sizeof(char16_t), ""); const jchar* descriptorChars = env->GetStringChars(descriptor, nullptr); const char16_t* rawDescriptor = reinterpret_cast<const char16_t*>(descriptorChars); jsize rawDescriptorLen = env->GetStringLength(descriptor); mDescriptor = String16(rawDescriptor, rawDescriptorLen); env->ReleaseStringChars(descriptor, descriptorChars); }); return mDescriptor; } status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) override { { JNIEnv* env = javavm_to_jnienv(mVM); JNIEnv* env = javavm_to_jnienv(mVM); Loading Loading @@ -376,7 +402,7 @@ protected: return res != JNI_FALSE ? NO_ERROR : UNKNOWN_TRANSACTION; return res != JNI_FALSE ? NO_ERROR : UNKNOWN_TRANSACTION; } } virtual status_t dump(int fd, const Vector<String16>& args) status_t dump(int fd, const Vector<String16>& args) override { { return 0; return 0; } } Loading @@ -384,6 +410,9 @@ protected: private: private: JavaVM* const mVM; JavaVM* const mVM; jobject const mObject; // GlobalRef to Java Binder jobject const mObject; // GlobalRef to Java Binder mutable std::once_flag mPopulateDescriptor; mutable String16 mDescriptor; }; }; // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- Loading Loading @@ -926,6 +955,8 @@ static int int_register_android_os_Binder(JNIEnv* env) gBinderOffsets.mClass = MakeGlobalRefOrDie(env, clazz); gBinderOffsets.mClass = MakeGlobalRefOrDie(env, clazz); gBinderOffsets.mExecTransact = GetMethodIDOrDie(env, clazz, "execTransact", "(IJJI)Z"); gBinderOffsets.mExecTransact = GetMethodIDOrDie(env, clazz, "execTransact", "(IJJI)Z"); gBinderOffsets.mGetInterfaceDescriptor = GetMethodIDOrDie(env, clazz, "getInterfaceDescriptor", "()Ljava/lang/String;"); gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J"); gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J"); return RegisterMethodsOrDie( return RegisterMethodsOrDie( Loading Loading
core/jni/android_util_Binder.cpp +34 −3 Original line number Original line Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <atomic> #include <atomic> #include <fcntl.h> #include <fcntl.h> #include <inttypes.h> #include <inttypes.h> #include <mutex> #include <stdio.h> #include <stdio.h> #include <sys/stat.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/types.h> Loading Loading @@ -69,6 +70,7 @@ static struct bindernative_offsets_t // Class state. // Class state. jclass mClass; jclass mClass; jmethodID mExecTransact; jmethodID mExecTransact; jmethodID mGetInterfaceDescriptor; // Object state. // Object state. jfieldID mObject; jfieldID mObject; Loading Loading @@ -326,8 +328,32 @@ protected: env->DeleteGlobalRef(mObject); env->DeleteGlobalRef(mObject); } } virtual status_t onTransact( const String16& getInterfaceDescriptor() const override uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) { call_once(mPopulateDescriptor, [this] { JNIEnv* env = javavm_to_jnienv(mVM); ALOGV("getInterfaceDescriptor() on %p calling object %p in env %p vm %p\n", this, mObject, env, mVM); jstring descriptor = (jstring)env->CallObjectMethod(mObject, gBinderOffsets.mGetInterfaceDescriptor); if (descriptor == nullptr) { return; } static_assert(sizeof(jchar) == sizeof(char16_t), ""); const jchar* descriptorChars = env->GetStringChars(descriptor, nullptr); const char16_t* rawDescriptor = reinterpret_cast<const char16_t*>(descriptorChars); jsize rawDescriptorLen = env->GetStringLength(descriptor); mDescriptor = String16(rawDescriptor, rawDescriptorLen); env->ReleaseStringChars(descriptor, descriptorChars); }); return mDescriptor; } status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) override { { JNIEnv* env = javavm_to_jnienv(mVM); JNIEnv* env = javavm_to_jnienv(mVM); Loading Loading @@ -376,7 +402,7 @@ protected: return res != JNI_FALSE ? NO_ERROR : UNKNOWN_TRANSACTION; return res != JNI_FALSE ? NO_ERROR : UNKNOWN_TRANSACTION; } } virtual status_t dump(int fd, const Vector<String16>& args) status_t dump(int fd, const Vector<String16>& args) override { { return 0; return 0; } } Loading @@ -384,6 +410,9 @@ protected: private: private: JavaVM* const mVM; JavaVM* const mVM; jobject const mObject; // GlobalRef to Java Binder jobject const mObject; // GlobalRef to Java Binder mutable std::once_flag mPopulateDescriptor; mutable String16 mDescriptor; }; }; // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- Loading Loading @@ -926,6 +955,8 @@ static int int_register_android_os_Binder(JNIEnv* env) gBinderOffsets.mClass = MakeGlobalRefOrDie(env, clazz); gBinderOffsets.mClass = MakeGlobalRefOrDie(env, clazz); gBinderOffsets.mExecTransact = GetMethodIDOrDie(env, clazz, "execTransact", "(IJJI)Z"); gBinderOffsets.mExecTransact = GetMethodIDOrDie(env, clazz, "execTransact", "(IJJI)Z"); gBinderOffsets.mGetInterfaceDescriptor = GetMethodIDOrDie(env, clazz, "getInterfaceDescriptor", "()Ljava/lang/String;"); gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J"); gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J"); return RegisterMethodsOrDie( return RegisterMethodsOrDie( Loading