< prev index next >

src/java.base/share/classes/jdk/internal/foreign/HeaderImplGenerator.java

Print this page

        

@@ -86,11 +86,23 @@
     }
 
     @Override
     protected void generateMembers(BinderClassWriter cw) {
         Class<?> headerClass = interfaces[0];
-        String declarations = headerClass.getAnnotation(NativeHeader.class).declarations();
+        handleDeclarations(headerClass);
+        super.generateMembers(cw);
+    }
+
+    private void handleDeclarations(Class<?> cls) {
+        for (Class<?> si : cls.getInterfaces()) {
+            handleDeclarations(si);
+        }
+        if (!cls.isAnnotationPresent(NativeHeader.class)) {
+            // nothing to do!
+            return;
+        }
+        String declarations = cls.getAnnotation(NativeHeader.class).declarations();
         for (Map.Entry<String, Object> declEntry : DescriptorParser.parseHeaderDeclarations(declarations).entrySet()) {
             if (declEntry.getValue() instanceof Layout) {
                 Layout l = (Layout)declEntry.getValue();
                 for (Map.Entry<AccessorKind, String> accessorEntry : AccessorKind.from(l).entrySet()) {
                     nameToInfo.put(accessorEntry.getValue(), new GlobalVarInfo(declEntry.getKey(), l, accessorEntry.getKey()));

@@ -98,11 +110,10 @@
             } else {
                 Function f = (Function)declEntry.getValue();
                 nameToInfo.put(declEntry.getKey(), new FunctionInfo(declEntry.getKey(), f));
             }
         }
-        super.generateMembers(cw);
     }
 
     @Override
     protected void generateConstructor(BinderClassWriter cw) {
         MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
< prev index next >