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

Commit 0382be2f authored by Yifan Hong's avatar Yifan Hong
Browse files

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

Also cleans up usage of different strings
in getService.

Test: wifi and fingerprint works.

Bug: 34691352
Change-Id: Id1f68115b15c21f70b0be8e7a1400de563d1da11
parent 0784e511
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"


@@ -293,6 +294,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;
@@ -310,27 +313,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 */);