@@ -84,16 +84,59 @@ internal JniInstanceMethods GetConstructorsForType (Type declaringType)
8484 public JniMethodInfo GetMethodInfo ( string encodedMember )
8585 {
8686 lock ( InstanceMethods ) {
87- if ( ! InstanceMethods . TryGetValue ( encodedMember , out var m ) ) {
88- string method , signature ;
89- JniPeerMembers . GetNameAndSignature ( encodedMember , out method , out signature ) ;
90- m = JniPeerType . GetInstanceMethod ( method , signature ) ;
91- InstanceMethods . Add ( encodedMember , m ) ;
87+ if ( InstanceMethods . TryGetValue ( encodedMember , out var m ) ) {
88+ return m ;
9289 }
93- return m ;
9490 }
91+ string method , signature ;
92+ JniPeerMembers . GetNameAndSignature ( encodedMember , out method , out signature ) ;
93+ var info = GetMethodInfo ( method , signature ) ;
94+ lock ( InstanceMethods ) {
95+ if ( InstanceMethods . TryGetValue ( encodedMember , out var m ) ) {
96+ return m ;
97+ }
98+ InstanceMethods . Add ( encodedMember , info ) ;
99+ }
100+ return info ;
95101 }
96102
103+ JniMethodInfo GetMethodInfo ( string method , string signature )
104+ {
105+ #if NET
106+ var m = ( JniMethodInfo ? ) null ;
107+ var newMethod = JniEnvironment . Runtime . TypeManager . GetReplacementMethodInfo ( Members . JniPeerTypeName , method , signature ) ;
108+ if ( newMethod . HasValue ) {
109+ using var t = new JniType ( newMethod . Value . JniTargetType ?? JniPeerType . Name ) ;
110+ if ( newMethod . Value . TargetJniMethodIsStatic && t . TryGetStaticMethod (
111+ newMethod . Value . TargetJniMethodName ?? method ,
112+ newMethod . Value . TargetJniMethodSignature ?? signature ,
113+ out m ) ) {
114+ m . ParameterCount = newMethod . Value . TargetJniMethodParameterCount ;
115+ m . StaticRedirect = new JniType ( newMethod . Value . JniTargetType ?? JniPeerType . Name ) ;
116+ return m ;
117+ }
118+ if ( t . TryGetInstanceMethod (
119+ newMethod . Value . TargetJniMethodName ?? method ,
120+ newMethod . Value . TargetJniMethodSignature ?? signature ,
121+ out m ) ) {
122+ return m ;
123+ }
124+ }
125+ if ( JniPeerType . TryGetInstanceMethod ( method , signature , out m ) ) {
126+ return m ;
127+ }
128+ var fallbackTypes = JniEnvironment . Runtime . TypeManager . GetFallbackTypes ( Members . JniPeerTypeName ) ;
129+ if ( fallbackTypes != null ) {
130+ foreach ( var ft in fallbackTypes ) {
131+ using var t = new JniType ( ft ) ;
132+ if ( t . TryGetInstanceMethod ( method , signature , out m ) ) {
133+ return m ;
134+ }
135+ }
136+ }
137+ #endif // NET
138+ return JniPeerType . GetInstanceMethod ( method , signature ) ;
139+ }
97140 public unsafe JniObjectReference StartCreateInstance ( string constructorSignature , Type declaringType , JniArgumentValue * parameters )
98141 {
99142 if ( constructorSignature == null )
0 commit comments