From 0382be2f32a78c3ee5f1601bb0a4cef8ae9c0903 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Mon, 6 Feb 2017 12:43:08 -0800 Subject: [PATCH] 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 --- core/jni/Android.mk | 1 + core/jni/android_os_HwBinder.cpp | 37 +++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/core/jni/Android.mk b/core/jni/Android.mk index e940732cec8a2..a9ca12b26d0b6 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -273,6 +273,7 @@ LOCAL_SHARED_LIBRARIES := \ libhidlbase \ libhidltransport \ libhwbinder \ + libvintf \ LOCAL_SHARED_LIBRARIES += \ libhwui \ diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp index d35ffbba3a1e1..4da33761d55ba 100644 --- a/core/jni/android_os_HwBinder.cpp +++ b/core/jni/android_os_HwBinder.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "core_jni_helpers.h" @@ -293,6 +294,8 @@ static jobject JHwBinder_native_getService( jstring ifaceNameObj, jstring serviceNameObj) { + using ::android::vintf::operator<<; + if (ifaceNameObj == NULL) { jniThrowException(env, "java/lang/NullPointerException", NULL); return NULL; @@ -310,27 +313,41 @@ static jobject JHwBinder_native_getService( return NULL; } - const char *ifaceName = env->GetStringUTFChars(ifaceNameObj, NULL); - if (ifaceName == NULL) { + const char *ifaceNameCStr = env->GetStringUTFChars(ifaceNameObj, NULL); + if (ifaceNameCStr == NULL) { return NULL; // XXX exception already pending? } - const char *serviceName = env->GetStringUTFChars(serviceNameObj, NULL); - if (serviceName == NULL) { - env->ReleaseStringUTFChars(ifaceNameObj, ifaceName); + std::string ifaceName(ifaceNameCStr); + env->ReleaseStringUTFChars(ifaceNameObj, ifaceNameCStr); + ::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? } + 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 " << ifaceName << "/" << serviceName; - Return> 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); - ifaceName = NULL; - env->ReleaseStringUTFChars(serviceNameObj, serviceName); - serviceName = NULL; + Return> ret = manager->get(ifaceNameHStr, serviceNameHStr); if (!ret.isOk()) { signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);