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

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

Merge "Update for namespaced services in hwservicemanager."

am: 605df82c

Change-Id: I38d861ca107665f1f865f19eebd1be368a8c77a4
parents 06c65cc2 605df82c
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.os;

import java.util.ArrayList;
import libcore.util.NativeAllocationRegistry;

/** @hide */
@@ -39,10 +40,12 @@ public abstract class HwBinder implements IHwBinder {
            int code, HwParcel request, HwParcel reply, int flags);

    public native final void registerService(
            String serviceName, int versionMajor, int versionMinor);
            ArrayList<String> interfaceChain,
            String serviceName);

    public static native final IHwBinder getService(
            String serviceName, int versionMajor, int versionMinor);
            String iface,
            String serviceName);

    // Returns address of the "freeFunction".
    private static native final long native_init();
+59 −55
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@
#include "core_jni_helpers.h"

using android::AndroidRuntime;
using android::hardware::hidl_vec;
using android::hardware::hidl_string;

#define PACKAGE_PATH    "android/os"
#define CLASS_NAME      "HwBinder"
@@ -41,10 +43,15 @@ using android::AndroidRuntime;

namespace android {

static jclass gArrayListClass;
static struct {
    jmethodID size;
    jmethodID get;
} gArrayListMethods;

static struct fields_t {
    jfieldID contextID;
    jmethodID onTransactID;

} gFields;

// static
@@ -199,45 +206,46 @@ static void JHwBinder_native_transact(
static void JHwBinder_native_registerService(
        JNIEnv *env,
        jobject thiz,
        jstring serviceNameObj,
        jint versionMajor,
        jint versionMinor) {
        jobject interfaceChainArrayList,
        jstring serviceNameObj) {
    if (serviceNameObj == NULL) {
        jniThrowException(env, "java/lang/NullPointerException", NULL);
        return;
    }

    if (versionMajor < 0
            || versionMajor > 65535
            || versionMinor < 0
            || versionMinor > 65535) {
        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
        return;
    }

    const jchar *serviceName = env->GetStringCritical(serviceNameObj, NULL);

    const char *serviceName = env->GetStringUTFChars(serviceNameObj, NULL);
    if (serviceName == NULL) {
        return;  // XXX exception already pending?
    }

    using android::hidl::manager::V1_0::IServiceManager;
    jint numInterfaces = env->CallIntMethod(interfaceChainArrayList,
                                            gArrayListMethods.size);
    hidl_string *strings = new hidl_string[numInterfaces];

    for (jint i = 0; i < numInterfaces; i++) {
        jstring strObj = static_cast<jstring>(
            env->CallObjectMethod(interfaceChainArrayList,
                                  gArrayListMethods.get,
                                  i)
        );
        const char * str = env->GetStringUTFChars(strObj, nullptr);
        strings[i] = hidl_string(str);
        env->ReleaseStringUTFChars(strObj, str);
    }

    const IServiceManager::Version kVersion {
        .major = static_cast<uint16_t>(versionMajor),
        .minor = static_cast<uint16_t>(versionMinor),
    };
    hidl_vec<hidl_string> interfaceChain;
    interfaceChain.setToExternal(strings, numInterfaces, true /* shouldOwn */);

    using android::hidl::manager::V1_0::IServiceManager;

    sp<hardware::IBinder> binder = JHwBinder::GetNativeContext(env, thiz);

    bool ok = hardware::defaultServiceManager()->add(
                String8(String16(
                          reinterpret_cast<const char16_t *>(serviceName),
                          env->GetStringLength(serviceNameObj))).string(),
                binder,
                kVersion);
                interfaceChain,
                serviceName,
                binder);

    env->ReleaseStringCritical(serviceNameObj, serviceName);
    env->ReleaseStringUTFChars(serviceNameObj, serviceName);
    serviceName = NULL;

    if (ok) {
@@ -251,52 +259,43 @@ static void JHwBinder_native_registerService(
static jobject JHwBinder_native_getService(
        JNIEnv *env,
        jclass /* clazzObj */,
        jstring serviceNameObj,
        jint versionMajor,
        jint versionMinor) {
    if (serviceNameObj == NULL) {
        jstring ifaceNameObj,
        jstring serviceNameObj) {

    if (ifaceNameObj == NULL) {
        jniThrowException(env, "java/lang/NullPointerException", NULL);
        return NULL;
    }

    if (versionMajor < 0
            || versionMajor > 65535
            || versionMinor < 0
            || versionMinor > 65535) {
        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
    if (serviceNameObj == NULL) {
        jniThrowException(env, "java/lang/NullPointerException", NULL);
        return NULL;
    }

    const jchar *serviceName = env->GetStringCritical(serviceNameObj, NULL);

    const char *ifaceName = env->GetStringUTFChars(ifaceNameObj, NULL);
    if (ifaceName == NULL) {
        return NULL; // XXX exception already pending?
    }
    const char *serviceName = env->GetStringUTFChars(serviceNameObj, NULL);
    if (serviceName == NULL) {
        env->ReleaseStringUTFChars(ifaceNameObj, ifaceName);
        return NULL; // XXX exception already pending?
    }

    using android::hidl::manager::V1_0::IServiceManager;

    const IServiceManager::Version kVersion {
        .major = static_cast<uint16_t>(versionMajor),
        .minor = static_cast<uint16_t>(versionMinor),
    };

    LOG(INFO) << "looking for service '"
              << String8(String16(
                          reinterpret_cast<const char16_t *>(serviceName),
                          env->GetStringLength(serviceNameObj))).string()
              << serviceName
              << "'";

    sp<hardware::IBinder> service;
    hardware::defaultServiceManager()->get(
            String8(String16(
                      reinterpret_cast<const char16_t *>(serviceName),
                      env->GetStringLength(serviceNameObj))).string(),
            kVersion,
            ifaceName,
            serviceName,
            [&service](sp<hardware::IBinder> out) {
                service = out;
            });

    env->ReleaseStringCritical(serviceNameObj, serviceName);
    env->ReleaseStringUTFChars(ifaceNameObj, ifaceName);
    ifaceName = NULL;
    env->ReleaseStringUTFChars(serviceNameObj, serviceName);
    serviceName = NULL;

    if (service == NULL) {
@@ -318,16 +317,21 @@ static JNINativeMethod gMethods[] = {
        "(IL" PACKAGE_PATH "/HwParcel;L" PACKAGE_PATH "/HwParcel;I)V",
        (void *)JHwBinder_native_transact },

    { "registerService", "(Ljava/lang/String;II)V",
    { "registerService", "(Ljava/util/ArrayList;Ljava/lang/String;)V",
        (void *)JHwBinder_native_registerService },

    { "getService", "(Ljava/lang/String;II)L" PACKAGE_PATH "/IHwBinder;",
    { "getService", "(Ljava/lang/String;Ljava/lang/String;)L" PACKAGE_PATH "/IHwBinder;",
        (void *)JHwBinder_native_getService },
};

namespace android {

int register_android_os_HwBinder(JNIEnv *env) {
    jclass arrayListClass = FindClassOrDie(env, "java/util/ArrayList");
    gArrayListClass = MakeGlobalRefOrDie(env, arrayListClass);
    gArrayListMethods.size = GetMethodIDOrDie(env, arrayListClass, "size", "()I");
    gArrayListMethods.get = GetMethodIDOrDie(env, arrayListClass, "get", "(I)Ljava/lang/Object;");

    return RegisterMethodsOrDie(env, CLASS_PATH, gMethods, NELEM(gMethods));
}