@@ -197,6 +197,12 @@ void ScanAssembly (AssemblyIndex index, Dictionary<string, JavaPeerInfo> results
197197 var isUnconditional = attrInfo is not null ;
198198 string ? invokerTypeName = null ;
199199
200+ // Resolve base Java type name
201+ var baseJavaName = ResolveBaseJavaName ( typeDef , index , results ) ;
202+
203+ // Resolve implemented Java interface names
204+ var implementedInterfaces = ResolveImplementedInterfaceJavaNames ( typeDef , index ) ;
205+
200206 // Collect marshal methods (including constructors) in a single pass over methods
201207 var marshalMethods = CollectMarshalMethods ( typeDef , index ) ;
202208
@@ -215,6 +221,8 @@ void ScanAssembly (AssemblyIndex index, Dictionary<string, JavaPeerInfo> results
215221 ManagedTypeNamespace = ExtractNamespace ( fullName ) ,
216222 ManagedTypeShortName = ExtractShortName ( fullName ) ,
217223 AssemblyName = index . AssemblyName ,
224+ BaseJavaName = baseJavaName ,
225+ ImplementedInterfaceJavaNames = implementedInterfaces ,
218226 IsInterface = isInterface ,
219227 IsAbstract = isAbstract ,
220228 DoNotGenerateAcw = doNotGenerateAcw ,
@@ -283,6 +291,51 @@ static void AddMarshalMethod (List<MarshalMethodInfo> methods, RegisterInfo regi
283291 } ) ;
284292 }
285293
294+ string ? ResolveBaseJavaName ( TypeDefinition typeDef , AssemblyIndex index , Dictionary < string , JavaPeerInfo > results )
295+ {
296+ var baseInfo = GetBaseTypeInfo ( typeDef , index ) ;
297+ if ( baseInfo is null ) {
298+ return null ;
299+ }
300+
301+ var ( baseTypeName , baseAssemblyName ) = baseInfo . Value ;
302+
303+ // First try [Register] attribute
304+ var registerJniName = ResolveRegisterJniName ( baseTypeName , baseAssemblyName ) ;
305+ if ( registerJniName is not null ) {
306+ return registerJniName ;
307+ }
308+
309+ // Fall back to already-scanned results (component-attributed or CRC64-computed peers)
310+ if ( results . TryGetValue ( baseTypeName , out var basePeer ) ) {
311+ return basePeer . JavaName ;
312+ }
313+
314+ return null ;
315+ }
316+
317+ List < string > ResolveImplementedInterfaceJavaNames ( TypeDefinition typeDef , AssemblyIndex index )
318+ {
319+ var result = new List < string > ( ) ;
320+ var interfaceImpls = typeDef . GetInterfaceImplementations ( ) ;
321+
322+ foreach ( var implHandle in interfaceImpls ) {
323+ var impl = index . Reader . GetInterfaceImplementation ( implHandle ) ;
324+ var ifaceJniName = ResolveInterfaceJniName ( impl . Interface , index ) ;
325+ if ( ifaceJniName is not null ) {
326+ result . Add ( ifaceJniName ) ;
327+ }
328+ }
329+
330+ return result ;
331+ }
332+
333+ string ? ResolveInterfaceJniName ( EntityHandle interfaceHandle , AssemblyIndex index )
334+ {
335+ var resolved = ResolveEntityHandle ( interfaceHandle , index ) ;
336+ return resolved is not null ? ResolveRegisterJniName ( resolved . Value . typeName , resolved . Value . assemblyName ) : null ;
337+ }
338+
286339 static bool TryGetMethodRegisterInfo ( MethodDefinition methodDef , AssemblyIndex index , out RegisterInfo ? registerInfo , out ExportInfo ? exportInfo )
287340 {
288341 exportInfo = null ;
0 commit comments