Changes to UNEXPECTED_NULL handling in libbinder_rs.

Two changes related to UNEXPECTED_NULL in libbinder_rs:
1) Return UNEXPECTED_NULL from Deserialize for SpIBinder instead of
   panicking
2) Convert UNEXPECTED_NULL status codes to NULL_POINTER exceptions,
   for compatibility with C++ and Java services.

Test: atest aidl_integration_test with 1406447 applied
Change-Id: I2e7cc92b2e1cf08a35968f675827d7d917144110
diff --git a/libs/binder/rust/src/binder.rs b/libs/binder/rust/src/binder.rs
index 6bf9cd5..6186b88 100644
--- a/libs/binder/rust/src/binder.rs
+++ b/libs/binder/rust/src/binder.rs
@@ -529,7 +529,17 @@
             }
 
             fn on_transact(&self, code: $crate::TransactionCode, data: &$crate::Parcel, reply: &mut $crate::Parcel) -> $crate::Result<()> {
-                $on_transact(&*self.0, code, data, reply)
+                match $on_transact(&*self.0, code, data, reply) {
+                    // The C++ backend converts UNEXPECTED_NULL into an exception
+                    Err($crate::StatusCode::UNEXPECTED_NULL) => {
+                        let status = $crate::Status::new_exception(
+                            $crate::ExceptionCode::NULL_POINTER,
+                            None,
+                        );
+                        reply.write(&status)
+                    },
+                    result => result
+                }
             }
 
             fn get_class() -> $crate::InterfaceClass {