diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp index e65390047c552..d35ffbba3a1e1 100644 --- a/core/jni/android_os_HwBinder.cpp +++ b/core/jni/android_os_HwBinder.cpp @@ -302,6 +302,14 @@ static jobject JHwBinder_native_getService( return NULL; } + auto manager = hardware::defaultServiceManager(); + + if (manager == nullptr) { + LOG(ERROR) << "Could not get hwservicemanager."; + signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */); + return NULL; + } + const char *ifaceName = env->GetStringUTFChars(ifaceNameObj, NULL); if (ifaceName == NULL) { return NULL; // XXX exception already pending? @@ -312,32 +320,26 @@ static jobject JHwBinder_native_getService( return NULL; // XXX exception already pending? } - LOG(INFO) << "looking for service '" - << serviceName - << "'"; - - auto manager = hardware::defaultServiceManager(); - - if (manager == nullptr) { - LOG(ERROR) << "Could not get hwservicemanager."; - signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */); - return NULL; - } + LOG(INFO) << "Looking for service " + << ifaceName + << "/" + << serviceName; Return> ret = manager->get(ifaceName, serviceName); - if (!ret.isOk()) { - signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */); - } - - sp service = hardware::toBinder< - hidl::base::V1_0::IBase, hidl::base::V1_0::BpHwBase>(ret); - env->ReleaseStringUTFChars(ifaceNameObj, ifaceName); ifaceName = NULL; env->ReleaseStringUTFChars(serviceNameObj, serviceName); serviceName = NULL; + if (!ret.isOk()) { + signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */); + return NULL; + } + + sp service = hardware::toBinder< + hidl::base::V1_0::IBase, hidl::base::V1_0::BpHwBase>(ret); + if (service == NULL) { signalExceptionForError(env, NAME_NOT_FOUND); return NULL;