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

Commit 01f374c6 authored by Yifan Hong's avatar Yifan Hong Committed by Gerrit Code Review
Browse files

Merge "android.os.HwBinder.getService() in Java respects VINTF."

parents 8fbf6a29 0382be2f
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 */);