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

Commit 2e943c53 authored by Yifan Hong's avatar Yifan Hong Committed by android-build-merger
Browse files

Merge "android.os.HwBinder.getService() in Java respects VINTF." am: 01f374c6

am: 71e77c86

Change-Id: I37c99d5135046c6b0d2589f321cd8e4b235392e7
parents 060cde98 71e77c86
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -273,6 +273,7 @@ LOCAL_SHARED_LIBRARIES := \
    libhidlbase \
    libhidlbase \
    libhidltransport \
    libhidltransport \
    libhwbinder \
    libhwbinder \
    libvintf \


LOCAL_SHARED_LIBRARIES += \
LOCAL_SHARED_LIBRARIES += \
    libhwui \
    libhwui \
+27 −10
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@
#include <hidl/HidlTransportSupport.h>
#include <hidl/HidlTransportSupport.h>
#include <hwbinder/ProcessState.h>
#include <hwbinder/ProcessState.h>
#include <nativehelper/ScopedLocalRef.h>
#include <nativehelper/ScopedLocalRef.h>
#include <vintf/parse_string.h>


#include "core_jni_helpers.h"
#include "core_jni_helpers.h"


@@ -300,6 +301,8 @@ static jobject JHwBinder_native_getService(
        jstring ifaceNameObj,
        jstring ifaceNameObj,
        jstring serviceNameObj) {
        jstring serviceNameObj) {


    using ::android::vintf::operator<<;

    if (ifaceNameObj == NULL) {
    if (ifaceNameObj == NULL) {
        jniThrowException(env, "java/lang/NullPointerException", NULL);
        jniThrowException(env, "java/lang/NullPointerException", NULL);
        return NULL;
        return NULL;
@@ -317,27 +320,41 @@ static jobject JHwBinder_native_getService(
        return NULL;
        return NULL;
    }
    }


    const char *ifaceName = env->GetStringUTFChars(ifaceNameObj, NULL);
    const char *ifaceNameCStr = env->GetStringUTFChars(ifaceNameObj, NULL);
    if (ifaceName == NULL) {
    if (ifaceNameCStr == NULL) {
        return NULL; // XXX exception already pending?
        return NULL; // XXX exception already pending?
    }
    }
    const char *serviceName = env->GetStringUTFChars(serviceNameObj, NULL);
    std::string ifaceName(ifaceNameCStr);
    if (serviceName == NULL) {
    env->ReleaseStringUTFChars(ifaceNameObj, ifaceNameCStr);
        env->ReleaseStringUTFChars(ifaceNameObj, ifaceName);
    ::android::hardware::hidl_string ifaceNameHStr;
    ifaceNameHStr.setToExternal(ifaceName.c_str(), ifaceName.size());

    const char *serviceNameCStr = env->GetStringUTFChars(serviceNameObj, NULL);
    if (serviceNameCStr == NULL) {
        return NULL; // XXX exception already pending?
        return NULL; // XXX exception already pending?
    }
    }
    std::string serviceName(serviceNameCStr);
    env->ReleaseStringUTFChars(serviceNameObj, serviceNameCStr);
    ::android::hardware::hidl_string serviceNameHStr;
    serviceNameHStr.setToExternal(serviceName.c_str(), serviceName.size());


    LOG(INFO) << "Looking for service "
    LOG(INFO) << "Looking for service "
              << ifaceName
              << ifaceName
              << "/"
              << "/"
              << serviceName;
              << serviceName;


    Return<sp<hidl::base::V1_0::IBase>> ret = manager->get(ifaceName, serviceName);
    ::android::vintf::Transport transport =
            ::android::hardware::getTransport(ifaceName);
    if (   transport != ::android::vintf::Transport::EMPTY
        && transport != ::android::vintf::Transport::HWBINDER) {
        LOG(ERROR) << "service " << ifaceName << " declares transport method "
                   << transport << " but framework expects "
                   << ::android::vintf::Transport::HWBINDER;
        signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);
        return NULL;
    }


    env->ReleaseStringUTFChars(ifaceNameObj, ifaceName);
    Return<sp<hidl::base::V1_0::IBase>> ret = manager->get(ifaceNameHStr, serviceNameHStr);
    ifaceName = NULL;
    env->ReleaseStringUTFChars(serviceNameObj, serviceName);
    serviceName = NULL;


    if (!ret.isOk()) {
    if (!ret.isOk()) {
        signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);
        signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);