NDK Backend: read/write result first.

This was a bug in the original implementations. Return variable values
go at the end of the parcel.

Bug: 112664205
Test: atest android.binder.cts
Change-Id: Ib474a0aa545d231c5c6f8c7e4d4bc34b0b6c8c71
diff --git a/generate_ndk.cpp b/generate_ndk.cpp
index 678608d..5b505eb 100644
--- a/generate_ndk.cpp
+++ b/generate_ndk.cpp
@@ -260,19 +260,18 @@
     out << "if (!AStatus_isOk(_aidl_status.get())) return _aidl_status;\n\n";
   }
 
-  for (const AidlArgument* arg : method.GetOutArguments()) {
-    out << "_aidl_ret_status = ";
-    ReadFromParcelFor({out, types, arg->GetType(), "_aidl_out.get()", cpp::BuildVarName(*arg)});
-    out << ";\n";
-    StatusCheckGoto(out);
-  }
-
   if (method.GetType().GetName() != "void") {
     out << "_aidl_ret_status = ";
     ReadFromParcelFor({out, types, method.GetType(), "_aidl_out.get()", "_aidl_return"});
     out << ";\n";
     StatusCheckGoto(out);
   }
+  for (const AidlArgument* arg : method.GetOutArguments()) {
+    out << "_aidl_ret_status = ";
+    ReadFromParcelFor({out, types, arg->GetType(), "_aidl_out.get()", cpp::BuildVarName(*arg)});
+    out << ";\n";
+    StatusCheckGoto(out);
+  }
 
   out << "_aidl_error:\n";
   out << "_aidl_status.set(AStatus_fromStatus(_aidl_ret_status));\n";
@@ -315,18 +314,18 @@
 
     out << "if (!AStatus_isOk(_aidl_status.get())) break;\n\n";
 
-    for (const AidlArgument* arg : method.GetOutArguments()) {
-      out << "_aidl_ret_status = ";
-      WriteToParcelFor({out, types, arg->GetType(), "_aidl_out", cpp::BuildVarName(*arg)});
-      out << ";\n";
-      StatusCheckBreak(out);
-    }
     if (method.GetType().GetName() != "void") {
       out << "_aidl_ret_status = ";
       WriteToParcelFor({out, types, method.GetType(), "_aidl_out", "_aidl_return"});
       out << ";\n";
       StatusCheckBreak(out);
     }
+    for (const AidlArgument* arg : method.GetOutArguments()) {
+      out << "_aidl_ret_status = ";
+      WriteToParcelFor({out, types, arg->GetType(), "_aidl_out", cpp::BuildVarName(*arg)});
+      out << ";\n";
+      StatusCheckBreak(out);
+    }
   }
 
   out << "break;\n";