diff options
| -rw-r--r-- | core/java/android/os/HwBinder.java | 7 | ||||
| -rw-r--r-- | core/java/android/os/HwRemoteBinder.java | 5 | ||||
| -rw-r--r-- | core/java/android/os/IHwBinder.java | 3 | ||||
| -rw-r--r-- | core/jni/android_os_HwBinder.cpp | 21 | ||||
| -rw-r--r-- | core/jni/android_os_HwParcel.cpp | 9 | ||||
| -rw-r--r-- | core/jni/android_os_HwParcel.h | 2 | ||||
| -rw-r--r-- | core/jni/android_os_HwRemoteBinder.cpp | 2 |
7 files changed, 41 insertions, 8 deletions
diff --git a/core/java/android/os/HwBinder.java b/core/java/android/os/HwBinder.java index 481b2dc096d5..bcc3468724fd 100644 --- a/core/java/android/os/HwBinder.java +++ b/core/java/android/os/HwBinder.java @@ -33,11 +33,14 @@ public abstract class HwBinder implements IHwBinder { mNativeContext); } + @Override public final native void transact( - int code, HwParcel request, HwParcel reply, int flags); + int code, HwParcel request, HwParcel reply, int flags) + throws RemoteException; public abstract void onTransact( - int code, HwParcel request, HwParcel reply, int flags); + int code, HwParcel request, HwParcel reply, int flags) + throws RemoteException; public native final void registerService( ArrayList<String> interfaceChain, diff --git a/core/java/android/os/HwRemoteBinder.java b/core/java/android/os/HwRemoteBinder.java index e617e0a52bc6..2f89ce6270be 100644 --- a/core/java/android/os/HwRemoteBinder.java +++ b/core/java/android/os/HwRemoteBinder.java @@ -32,12 +32,15 @@ public class HwRemoteBinder implements IHwBinder { mNativeContext); } + @Override public IHwInterface queryLocalInterface(String descriptor) { return null; } + @Override public native final void transact( - int code, HwParcel request, HwParcel reply, int flags); + int code, HwParcel request, HwParcel reply, int flags) + throws RemoteException; public native boolean linkToDeath(DeathRecipient recipient, long cookie); public native boolean unlinkToDeath(DeathRecipient recipient); diff --git a/core/java/android/os/IHwBinder.java b/core/java/android/os/IHwBinder.java index f93bfd79f625..2a6567989ced 100644 --- a/core/java/android/os/IHwBinder.java +++ b/core/java/android/os/IHwBinder.java @@ -23,7 +23,8 @@ public interface IHwBinder { public static final int FLAG_ONEWAY = 1; public void transact( - int code, HwParcel request, HwParcel reply, int flags); + int code, HwParcel request, HwParcel reply, int flags) + throws RemoteException; public IHwInterface queryLocalInterface(String descriptor); diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp index 95e031bd96d8..c456d622ab5a 100644 --- a/core/jni/android_os_HwBinder.cpp +++ b/core/jni/android_os_HwBinder.cpp @@ -52,6 +52,8 @@ static struct { jmethodID get; } gArrayListMethods; +static jclass gErrorClass; + static struct fields_t { jfieldID contextID; jmethodID onTransactID; @@ -144,6 +146,22 @@ status_t JHwBinder::onTransact( replyObj.get(), flags); + if (env->ExceptionCheck()) { + jthrowable excep = env->ExceptionOccurred(); + env->ExceptionDescribe(); + + if (env->IsInstanceOf(excep, gErrorClass)) { + /* It's an error */ + LOG(ERROR) << "Forcefully exiting"; + exit(1); + } else { + env->ExceptionClear(); + LOG(ERROR) << "Uncaught exception!"; + } + + env->DeleteLocalRef(excep); + } + status_t err = OK; if (!replyContext->wasSent()) { @@ -356,6 +374,9 @@ int register_android_os_HwBinder(JNIEnv *env) { gArrayListMethods.size = GetMethodIDOrDie(env, arrayListClass, "size", "()I"); gArrayListMethods.get = GetMethodIDOrDie(env, arrayListClass, "get", "(I)Ljava/lang/Object;"); + jclass errorClass = FindClassOrDie(env, "java/lang/Error"); + gErrorClass = MakeGlobalRefOrDie(env, errorClass); + return RegisterMethodsOrDie(env, CLASS_PATH, gMethods, NELEM(gMethods)); } diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp index a10d80746e46..b9d810a4190b 100644 --- a/core/jni/android_os_HwParcel.cpp +++ b/core/jni/android_os_HwParcel.cpp @@ -49,7 +49,7 @@ static struct fields_t { } gFields; -void signalExceptionForError(JNIEnv *env, status_t err) { +void signalExceptionForError(JNIEnv *env, status_t err, bool canThrowRemoteException) { switch (err) { case OK: break; @@ -114,8 +114,13 @@ void signalExceptionForError(JNIEnv *env, status_t err) { default: { + std::stringstream ss; + ss << "HwBinder Error: (" << err << ")"; + jniThrowException( - env, "java/lang/RuntimeException", "Unknown error"); + env, + canThrowRemoteException ? "android/os/RemoteException" : "java/lang/RuntimeException", + ss.str().c_str()); break; } diff --git a/core/jni/android_os_HwParcel.h b/core/jni/android_os_HwParcel.h index 708bbba1901c..f81de9bf30b7 100644 --- a/core/jni/android_os_HwParcel.h +++ b/core/jni/android_os_HwParcel.h @@ -67,7 +67,7 @@ private: DISALLOW_COPY_AND_ASSIGN(JHwParcel); }; -void signalExceptionForError(JNIEnv *env, status_t err); +void signalExceptionForError(JNIEnv *env, status_t err, bool canThrowRemoteException = false); int register_android_os_HwParcel(JNIEnv *env); } // namespace android diff --git a/core/jni/android_os_HwRemoteBinder.cpp b/core/jni/android_os_HwRemoteBinder.cpp index 0a7d84d9c8c5..f2f8e52db9f5 100644 --- a/core/jni/android_os_HwRemoteBinder.cpp +++ b/core/jni/android_os_HwRemoteBinder.cpp @@ -347,7 +347,7 @@ static void JHwRemoteBinder_native_transact( JHwParcel::GetNativeContext(env, replyObj)->getParcel(); status_t err = binder->transact(code, *request, reply, flags); - signalExceptionForError(env, err); + signalExceptionForError(env, err, true /* canThrowRemoteException */); } static jboolean JHwRemoteBinder_linkToDeath(JNIEnv* env, jobject thiz, |