Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a02d76e2 authored by Steven Moreland's avatar Steven Moreland Committed by android-build-merger
Browse files

Merge "JavaBBinder: implement getInterfaceDescriptor"

am: ffd40efe

Change-Id: I534b1fb57cf6845e89792cf3d4a09ce781c15a51
parents 10c17504 ffd40efe
Loading
Loading
Loading
Loading
+34 −3
Original line number Original line Diff line number Diff line
@@ -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>
@@ -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;
@@ -328,8 +330,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);


@@ -378,7 +404,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;
    }
    }
@@ -386,6 +412,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;
};
};


// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
@@ -939,6 +968,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(