Add special case to wrap abstract types

AHardwareBuffer and ANativeWindow are abstract objects we cannot copy.
Just save the pointer.

Bug: 219

Change-Id: I9f3b7b3fd4d6fb63d05dceaa2edc283a59a89838
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index 003e7a5..fb7d1d2 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -767,12 +767,6 @@
         safe_struct_helper_source = '\n'
         safe_struct_helper_source += '#include "vk_safe_struct.h"\n'
         safe_struct_helper_source += '#include <string.h>\n'
-        safe_struct_helper_source += '#ifdef VK_USE_PLATFORM_ANDROID_KHR\n'
-        safe_struct_helper_source += '#if __ANDROID_API__ < __ANDROID_API_O__\n'
-        safe_struct_helper_source += 'struct AHardwareBuffer {};\n'
-        safe_struct_helper_source += '#endif\n'
-        safe_struct_helper_source += '#endif\n'
-
         safe_struct_helper_source += '\n'
         safe_struct_helper_source += self.GenerateSafeStructSource()
         return safe_struct_helper_source
@@ -787,6 +781,12 @@
                        'VkAndroidSurfaceCreateInfoKHR',
                        'VkWin32SurfaceCreateInfoKHR'
                        ]
+
+        # For abstract types just want to save the pointer away
+        # since we cannot make a copy.
+        abstract_types = ['AHardwareBuffer',
+                          'ANativeWindow',
+                         ]
         for item in self.structMembers:
             if self.NeedSafeStruct(item) == False:
                 continue
@@ -1018,21 +1018,24 @@
                     else:
                         default_init_list += '\n    %s(nullptr),' % (member.name)
                         init_list += '\n    %s(nullptr),' % (member.name)
-                        init_func_txt += '    %s = nullptr;\n' % (member.name)
-                        if 'pNext' != member.name and 'void' not in m_type:
-                            if not member.isstaticarray and (member.len is None or '/' in member.len):
-                                construct_txt += '    if (in_struct->%s) {\n' % member.name
-                                construct_txt += '        %s = new %s(*in_struct->%s);\n' % (member.name, m_type, member.name)
-                                construct_txt += '    }\n'
-                                destruct_txt += '    if (%s)\n' % member.name
-                                destruct_txt += '        delete %s;\n' % member.name
-                            else:
-                                construct_txt += '    if (in_struct->%s) {\n' % member.name
-                                construct_txt += '        %s = new %s[in_struct->%s];\n' % (member.name, m_type, member.len)
-                                construct_txt += '        memcpy ((void *)%s, (void *)in_struct->%s, sizeof(%s)*in_struct->%s);\n' % (member.name, member.name, m_type, member.len)
-                                construct_txt += '    }\n'
-                                destruct_txt += '    if (%s)\n' % member.name
-                                destruct_txt += '        delete[] %s;\n' % member.name
+                        if m_type in abstract_types:
+                            construct_txt += '    %s = in_struct->%s;\n' % (member.name, member.name)
+                        else:
+                            init_func_txt += '    %s = nullptr;\n' % (member.name)
+                            if 'pNext' != member.name and 'void' not in m_type:
+                                if not member.isstaticarray and (member.len is None or '/' in member.len):
+                                    construct_txt += '    if (in_struct->%s) {\n' % member.name
+                                    construct_txt += '        %s = new %s(*in_struct->%s);\n' % (member.name, m_type, member.name)
+                                    construct_txt += '    }\n'
+                                    destruct_txt += '    if (%s)\n' % member.name
+                                    destruct_txt += '        delete %s;\n' % member.name
+                                else:
+                                    construct_txt += '    if (in_struct->%s) {\n' % member.name
+                                    construct_txt += '        %s = new %s[in_struct->%s];\n' % (member.name, m_type, member.len)
+                                    construct_txt += '        memcpy ((void *)%s, (void *)in_struct->%s, sizeof(%s)*in_struct->%s);\n' % (member.name, member.name, m_type, member.len)
+                                    construct_txt += '    }\n'
+                                    destruct_txt += '    if (%s)\n' % member.name
+                                    destruct_txt += '        delete[] %s;\n' % member.name
                 elif member.isstaticarray or member.len is not None:
                     if member.len is None:
                         # Extract length of static array by grabbing val between []